Average Error: 11.1 → 2.3
Time: 11.1s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le -3.721065323848875903560093256362069823088 \cdot 10^{-309} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 0.0\right) \land \frac{a1 \cdot a2}{b1 \cdot b2} \le 8.682799991236733148187736602059382241979 \cdot 10^{294}\right):\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le -3.721065323848875903560093256362069823088 \cdot 10^{-309} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 0.0\right) \land \frac{a1 \cdot a2}{b1 \cdot b2} \le 8.682799991236733148187736602059382241979 \cdot 10^{294}\right):\\
\;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r105422 = a1;
        double r105423 = a2;
        double r105424 = r105422 * r105423;
        double r105425 = b1;
        double r105426 = b2;
        double r105427 = r105425 * r105426;
        double r105428 = r105424 / r105427;
        return r105428;
}

double f(double a1, double a2, double b1, double b2) {
        double r105429 = a1;
        double r105430 = a2;
        double r105431 = r105429 * r105430;
        double r105432 = b1;
        double r105433 = b2;
        double r105434 = r105432 * r105433;
        double r105435 = r105431 / r105434;
        double r105436 = -inf.0;
        bool r105437 = r105435 <= r105436;
        double r105438 = -3.721065323848876e-309;
        bool r105439 = r105435 <= r105438;
        double r105440 = 0.0;
        bool r105441 = r105435 <= r105440;
        double r105442 = !r105441;
        double r105443 = 8.682799991236733e+294;
        bool r105444 = r105435 <= r105443;
        bool r105445 = r105442 && r105444;
        bool r105446 = r105439 || r105445;
        double r105447 = !r105446;
        bool r105448 = r105437 || r105447;
        double r105449 = r105429 / r105432;
        double r105450 = r105430 / r105433;
        double r105451 = r105449 * r105450;
        double r105452 = r105448 ? r105451 : r105435;
        return r105452;
}

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

Derivation

  1. Split input into 2 regimes
  2. if (/ (* a1 a2) (* b1 b2)) < -inf.0 or -3.721065323848876e-309 < (/ (* a1 a2) (* b1 b2)) < 0.0 or 8.682799991236733e+294 < (/ (* a1 a2) (* b1 b2))

    1. Initial program 32.8

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

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

    if -inf.0 < (/ (* a1 a2) (* b1 b2)) < -3.721065323848876e-309 or 0.0 < (/ (* a1 a2) (* b1 b2)) < 8.682799991236733e+294

    1. Initial program 3.5

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification2.3

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le -3.721065323848875903560093256362069823088 \cdot 10^{-309} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 0.0\right) \land \frac{a1 \cdot a2}{b1 \cdot b2} \le 8.682799991236733148187736602059382241979 \cdot 10^{294}\right):\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \end{array}\]

Reproduce

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

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

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