Average Error: 11.4 → 5.4
Time: 5.5s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -2.12735229765193038 \cdot 10^{182}:\\ \;\;\;\;\frac{a1}{b1 \cdot \frac{b2}{a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le -1.0024754663520561 \cdot 10^{-263}:\\ \;\;\;\;\frac{\left(a1 \cdot a2\right) \cdot \frac{1}{b2}}{b1}\\ \mathbf{elif}\;a1 \cdot a2 \le 5.48183825434908302 \cdot 10^{-297} \lor \neg \left(a1 \cdot a2 \le 2.32454057704183092 \cdot 10^{123}\right):\\ \;\;\;\;\frac{a1}{b1 \cdot \frac{b2}{a2}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;a1 \cdot a2 \le -2.12735229765193038 \cdot 10^{182}:\\
\;\;\;\;\frac{a1}{b1 \cdot \frac{b2}{a2}}\\

\mathbf{elif}\;a1 \cdot a2 \le -1.0024754663520561 \cdot 10^{-263}:\\
\;\;\;\;\frac{\left(a1 \cdot a2\right) \cdot \frac{1}{b2}}{b1}\\

\mathbf{elif}\;a1 \cdot a2 \le 5.48183825434908302 \cdot 10^{-297} \lor \neg \left(a1 \cdot a2 \le 2.32454057704183092 \cdot 10^{123}\right):\\
\;\;\;\;\frac{a1}{b1 \cdot \frac{b2}{a2}}\\

\mathbf{else}:\\
\;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r137539 = a1;
        double r137540 = a2;
        double r137541 = r137539 * r137540;
        double r137542 = b1;
        double r137543 = b2;
        double r137544 = r137542 * r137543;
        double r137545 = r137541 / r137544;
        return r137545;
}

double f(double a1, double a2, double b1, double b2) {
        double r137546 = a1;
        double r137547 = a2;
        double r137548 = r137546 * r137547;
        double r137549 = -2.1273522976519304e+182;
        bool r137550 = r137548 <= r137549;
        double r137551 = b1;
        double r137552 = b2;
        double r137553 = r137552 / r137547;
        double r137554 = r137551 * r137553;
        double r137555 = r137546 / r137554;
        double r137556 = -1.002475466352056e-263;
        bool r137557 = r137548 <= r137556;
        double r137558 = 1.0;
        double r137559 = r137558 / r137552;
        double r137560 = r137548 * r137559;
        double r137561 = r137560 / r137551;
        double r137562 = 5.481838254349083e-297;
        bool r137563 = r137548 <= r137562;
        double r137564 = 2.324540577041831e+123;
        bool r137565 = r137548 <= r137564;
        double r137566 = !r137565;
        bool r137567 = r137563 || r137566;
        double r137568 = r137548 / r137551;
        double r137569 = r137568 / r137552;
        double r137570 = r137567 ? r137555 : r137569;
        double r137571 = r137557 ? r137561 : r137570;
        double r137572 = r137550 ? r137555 : r137571;
        return r137572;
}

Error

Bits error versus a1

Bits error versus a2

Bits error versus b1

Bits error versus b2

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original11.4
Target11.0
Herbie5.4
\[\frac{a1}{b1} \cdot \frac{a2}{b2}\]

Derivation

  1. Split input into 3 regimes
  2. if (* a1 a2) < -2.1273522976519304e+182 or -1.002475466352056e-263 < (* a1 a2) < 5.481838254349083e-297 or 2.324540577041831e+123 < (* a1 a2)

    1. Initial program 22.5

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
    2. Using strategy rm
    3. Applied associate-/l*11.6

      \[\leadsto \color{blue}{\frac{a1}{\frac{b1 \cdot b2}{a2}}}\]
    4. Simplified6.9

      \[\leadsto \frac{a1}{\color{blue}{b1 \cdot \frac{b2}{a2}}}\]

    if -2.1273522976519304e+182 < (* a1 a2) < -1.002475466352056e-263

    1. Initial program 4.8

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
    2. Using strategy rm
    3. Applied times-frac13.9

      \[\leadsto \color{blue}{\frac{a1}{b1} \cdot \frac{a2}{b2}}\]
    4. Using strategy rm
    5. Applied associate-*l/11.0

      \[\leadsto \color{blue}{\frac{a1 \cdot \frac{a2}{b2}}{b1}}\]
    6. Using strategy rm
    7. Applied div-inv11.0

      \[\leadsto \frac{a1 \cdot \color{blue}{\left(a2 \cdot \frac{1}{b2}\right)}}{b1}\]
    8. Applied associate-*r*4.6

      \[\leadsto \frac{\color{blue}{\left(a1 \cdot a2\right) \cdot \frac{1}{b2}}}{b1}\]

    if 5.481838254349083e-297 < (* a1 a2) < 2.324540577041831e+123

    1. Initial program 4.8

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
    2. Using strategy rm
    3. Applied associate-/r*4.4

      \[\leadsto \color{blue}{\frac{\frac{a1 \cdot a2}{b1}}{b2}}\]
  3. Recombined 3 regimes into one program.
  4. Final simplification5.4

    \[\leadsto \begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -2.12735229765193038 \cdot 10^{182}:\\ \;\;\;\;\frac{a1}{b1 \cdot \frac{b2}{a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le -1.0024754663520561 \cdot 10^{-263}:\\ \;\;\;\;\frac{\left(a1 \cdot a2\right) \cdot \frac{1}{b2}}{b1}\\ \mathbf{elif}\;a1 \cdot a2 \le 5.48183825434908302 \cdot 10^{-297} \lor \neg \left(a1 \cdot a2 \le 2.32454057704183092 \cdot 10^{123}\right):\\ \;\;\;\;\frac{a1}{b1 \cdot \frac{b2}{a2}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \end{array}\]

Reproduce

herbie shell --seed 2020045 +o rules:numerics
(FPCore (a1 a2 b1 b2)
  :name "Quotient of products"
  :precision binary64

  :herbie-target
  (* (/ a1 b1) (/ a2 b2))

  (/ (* a1 a2) (* b1 b2)))