Average Error: 11.0 → 3.5
Time: 17.0s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -3.5370330458666065 \cdot 10^{-275}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -0.0:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 1.1837700328943485 \cdot 10^{+293}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\
\;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\

\mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -3.5370330458666065 \cdot 10^{-275}:\\
\;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\

\mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -0.0:\\
\;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\

\mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 1.1837700328943485 \cdot 10^{+293}:\\
\;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r5758529 = a1;
        double r5758530 = a2;
        double r5758531 = r5758529 * r5758530;
        double r5758532 = b1;
        double r5758533 = b2;
        double r5758534 = r5758532 * r5758533;
        double r5758535 = r5758531 / r5758534;
        return r5758535;
}

double f(double a1, double a2, double b1, double b2) {
        double r5758536 = a1;
        double r5758537 = a2;
        double r5758538 = r5758536 * r5758537;
        double r5758539 = b1;
        double r5758540 = b2;
        double r5758541 = r5758539 * r5758540;
        double r5758542 = r5758538 / r5758541;
        double r5758543 = -inf.0;
        bool r5758544 = r5758542 <= r5758543;
        double r5758545 = r5758538 / r5758539;
        double r5758546 = r5758545 / r5758540;
        double r5758547 = -3.5370330458666065e-275;
        bool r5758548 = r5758542 <= r5758547;
        double r5758549 = -0.0;
        bool r5758550 = r5758542 <= r5758549;
        double r5758551 = r5758537 / r5758539;
        double r5758552 = r5758551 / r5758540;
        double r5758553 = r5758536 * r5758552;
        double r5758554 = 1.1837700328943485e+293;
        bool r5758555 = r5758542 <= r5758554;
        double r5758556 = r5758536 / r5758539;
        double r5758557 = r5758537 / r5758540;
        double r5758558 = r5758556 * r5758557;
        double r5758559 = r5758555 ? r5758542 : r5758558;
        double r5758560 = r5758550 ? r5758553 : r5758559;
        double r5758561 = r5758548 ? r5758542 : r5758560;
        double r5758562 = r5758544 ? r5758546 : r5758561;
        return r5758562;
}

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.0
Target11.1
Herbie3.5
\[\frac{a1}{b1} \cdot \frac{a2}{b2}\]

Derivation

  1. Split input into 4 regimes
  2. if (/ (* a1 a2) (* b1 b2)) < -inf.0

    1. Initial program 59.9

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

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

    if -inf.0 < (/ (* a1 a2) (* b1 b2)) < -3.5370330458666065e-275 or -0.0 < (/ (* a1 a2) (* b1 b2)) < 1.1837700328943485e+293

    1. Initial program 0.9

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]

    if -3.5370330458666065e-275 < (/ (* a1 a2) (* b1 b2)) < -0.0

    1. Initial program 13.8

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

      \[\leadsto \color{blue}{\frac{a1}{b1} \cdot \frac{a2}{b2}}\]
    4. Using strategy rm
    5. Applied div-inv3.2

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

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

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

    if 1.1837700328943485e+293 < (/ (* a1 a2) (* b1 b2))

    1. Initial program 57.0

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -3.5370330458666065 \cdot 10^{-275}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -0.0:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 1.1837700328943485 \cdot 10^{+293}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \end{array}\]

Reproduce

herbie shell --seed 2019164 
(FPCore (a1 a2 b1 b2)
  :name "Quotient of products"

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

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