Average Error: 11.0 → 5.5
Time: 13.3s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -3.994607886164469 \cdot 10^{+285}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -8.15908135962733 \cdot 10^{-136}:\\ \;\;\;\;\frac{1}{\frac{b2 \cdot b1}{a1 \cdot a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le -1.189043301750101 \cdot 10^{-232}:\\ \;\;\;\;\frac{\frac{1}{\frac{b1}{a1 \cdot a2}}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 4.98603927195009 \cdot 10^{-194}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 1.9296454068039114 \cdot 10^{+193}:\\ \;\;\;\;\frac{\frac{1}{\frac{b1}{a1 \cdot a2}}}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{\frac{b2 \cdot b1}{a2}}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;a1 \cdot a2 \le -3.994607886164469 \cdot 10^{+285}:\\
\;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\

\mathbf{elif}\;a1 \cdot a2 \le -8.15908135962733 \cdot 10^{-136}:\\
\;\;\;\;\frac{1}{\frac{b2 \cdot b1}{a1 \cdot a2}}\\

\mathbf{elif}\;a1 \cdot a2 \le -1.189043301750101 \cdot 10^{-232}:\\
\;\;\;\;\frac{\frac{1}{\frac{b1}{a1 \cdot a2}}}{b2}\\

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

\mathbf{elif}\;a1 \cdot a2 \le 1.9296454068039114 \cdot 10^{+193}:\\
\;\;\;\;\frac{\frac{1}{\frac{b1}{a1 \cdot a2}}}{b2}\\

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r5221346 = a1;
        double r5221347 = a2;
        double r5221348 = r5221346 * r5221347;
        double r5221349 = b1;
        double r5221350 = b2;
        double r5221351 = r5221349 * r5221350;
        double r5221352 = r5221348 / r5221351;
        return r5221352;
}

double f(double a1, double a2, double b1, double b2) {
        double r5221353 = a1;
        double r5221354 = a2;
        double r5221355 = r5221353 * r5221354;
        double r5221356 = -3.994607886164469e+285;
        bool r5221357 = r5221355 <= r5221356;
        double r5221358 = b1;
        double r5221359 = r5221353 / r5221358;
        double r5221360 = b2;
        double r5221361 = r5221354 / r5221360;
        double r5221362 = r5221359 * r5221361;
        double r5221363 = -8.15908135962733e-136;
        bool r5221364 = r5221355 <= r5221363;
        double r5221365 = 1.0;
        double r5221366 = r5221360 * r5221358;
        double r5221367 = r5221366 / r5221355;
        double r5221368 = r5221365 / r5221367;
        double r5221369 = -1.189043301750101e-232;
        bool r5221370 = r5221355 <= r5221369;
        double r5221371 = r5221358 / r5221355;
        double r5221372 = r5221365 / r5221371;
        double r5221373 = r5221372 / r5221360;
        double r5221374 = 4.98603927195009e-194;
        bool r5221375 = r5221355 <= r5221374;
        double r5221376 = r5221354 / r5221358;
        double r5221377 = r5221376 / r5221360;
        double r5221378 = r5221353 * r5221377;
        double r5221379 = 1.9296454068039114e+193;
        bool r5221380 = r5221355 <= r5221379;
        double r5221381 = r5221366 / r5221354;
        double r5221382 = r5221353 / r5221381;
        double r5221383 = r5221380 ? r5221373 : r5221382;
        double r5221384 = r5221375 ? r5221378 : r5221383;
        double r5221385 = r5221370 ? r5221373 : r5221384;
        double r5221386 = r5221364 ? r5221368 : r5221385;
        double r5221387 = r5221357 ? r5221362 : r5221386;
        return r5221387;
}

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
Target10.8
Herbie5.5
\[\frac{a1}{b1} \cdot \frac{a2}{b2}\]

Derivation

  1. Split input into 5 regimes
  2. if (* a1 a2) < -3.994607886164469e+285

    1. Initial program 52.8

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

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

    if -3.994607886164469e+285 < (* a1 a2) < -8.15908135962733e-136

    1. Initial program 4.8

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
    2. Using strategy rm
    3. Applied clear-num5.0

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

    if -8.15908135962733e-136 < (* a1 a2) < -1.189043301750101e-232 or 4.98603927195009e-194 < (* a1 a2) < 1.9296454068039114e+193

    1. Initial program 4.9

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

      \[\leadsto \color{blue}{\frac{\frac{a1 \cdot a2}{b1}}{b2}}\]
    4. Using strategy rm
    5. Applied clear-num4.0

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

    if -1.189043301750101e-232 < (* a1 a2) < 4.98603927195009e-194

    1. Initial program 14.6

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

      \[\leadsto \color{blue}{\frac{\frac{a1 \cdot a2}{b1}}{b2}}\]
    4. Using strategy rm
    5. Applied *-un-lft-identity15.2

      \[\leadsto \frac{\frac{a1 \cdot a2}{b1}}{\color{blue}{1 \cdot b2}}\]
    6. Applied *-un-lft-identity15.2

      \[\leadsto \frac{\frac{a1 \cdot a2}{\color{blue}{1 \cdot b1}}}{1 \cdot b2}\]
    7. Applied times-frac7.9

      \[\leadsto \frac{\color{blue}{\frac{a1}{1} \cdot \frac{a2}{b1}}}{1 \cdot b2}\]
    8. Applied times-frac4.5

      \[\leadsto \color{blue}{\frac{\frac{a1}{1}}{1} \cdot \frac{\frac{a2}{b1}}{b2}}\]
    9. Simplified4.5

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

    if 1.9296454068039114e+193 < (* a1 a2)

    1. Initial program 33.2

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -3.994607886164469 \cdot 10^{+285}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -8.15908135962733 \cdot 10^{-136}:\\ \;\;\;\;\frac{1}{\frac{b2 \cdot b1}{a1 \cdot a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le -1.189043301750101 \cdot 10^{-232}:\\ \;\;\;\;\frac{\frac{1}{\frac{b1}{a1 \cdot a2}}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 4.98603927195009 \cdot 10^{-194}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 1.9296454068039114 \cdot 10^{+193}:\\ \;\;\;\;\frac{\frac{1}{\frac{b1}{a1 \cdot a2}}}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{\frac{b2 \cdot b1}{a2}}\\ \end{array}\]

Reproduce

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

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

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