Average Error: 11.1 → 5.4
Time: 15.5s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;b1 \cdot b2 \le -3.2418970626461063 \cdot 10^{+149}:\\ \;\;\;\;\frac{\frac{1}{b1}}{\frac{\frac{b2}{a1}}{a2}}\\ \mathbf{elif}\;b1 \cdot b2 \le -1.0084599578011689 \cdot 10^{-263}:\\ \;\;\;\;\frac{a1}{\frac{b1 \cdot b2}{a2}}\\ \mathbf{elif}\;b1 \cdot b2 \le 3.019673003289364 \cdot 10^{-116}:\\ \;\;\;\;\frac{\frac{a2}{\frac{b1}{a1}}}{b2}\\ \mathbf{elif}\;b1 \cdot b2 \le 2.5857146802439288 \cdot 10^{+182}:\\ \;\;\;\;\frac{a1}{\frac{b1 \cdot b2}{a2}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{1}{b1}}{\frac{\frac{b2}{a1}}{a2}}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;b1 \cdot b2 \le -3.2418970626461063 \cdot 10^{+149}:\\
\;\;\;\;\frac{\frac{1}{b1}}{\frac{\frac{b2}{a1}}{a2}}\\

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

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

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

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r5309537 = a1;
        double r5309538 = a2;
        double r5309539 = r5309537 * r5309538;
        double r5309540 = b1;
        double r5309541 = b2;
        double r5309542 = r5309540 * r5309541;
        double r5309543 = r5309539 / r5309542;
        return r5309543;
}

double f(double a1, double a2, double b1, double b2) {
        double r5309544 = b1;
        double r5309545 = b2;
        double r5309546 = r5309544 * r5309545;
        double r5309547 = -3.2418970626461063e+149;
        bool r5309548 = r5309546 <= r5309547;
        double r5309549 = 1.0;
        double r5309550 = r5309549 / r5309544;
        double r5309551 = a1;
        double r5309552 = r5309545 / r5309551;
        double r5309553 = a2;
        double r5309554 = r5309552 / r5309553;
        double r5309555 = r5309550 / r5309554;
        double r5309556 = -1.0084599578011689e-263;
        bool r5309557 = r5309546 <= r5309556;
        double r5309558 = r5309546 / r5309553;
        double r5309559 = r5309551 / r5309558;
        double r5309560 = 3.019673003289364e-116;
        bool r5309561 = r5309546 <= r5309560;
        double r5309562 = r5309544 / r5309551;
        double r5309563 = r5309553 / r5309562;
        double r5309564 = r5309563 / r5309545;
        double r5309565 = 2.5857146802439288e+182;
        bool r5309566 = r5309546 <= r5309565;
        double r5309567 = r5309566 ? r5309559 : r5309555;
        double r5309568 = r5309561 ? r5309564 : r5309567;
        double r5309569 = r5309557 ? r5309559 : r5309568;
        double r5309570 = r5309548 ? r5309555 : r5309569;
        return r5309570;
}

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

Derivation

  1. Split input into 3 regimes
  2. if (* b1 b2) < -3.2418970626461063e+149 or 2.5857146802439288e+182 < (* b1 b2)

    1. Initial program 14.6

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

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

      \[\leadsto \frac{\frac{a1 \cdot a2}{b1}}{\color{blue}{1 \cdot b2}}\]
    6. Applied associate-/r*7.9

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

      \[\leadsto \frac{\color{blue}{\frac{a2}{\frac{b1}{a1}}}}{b2}\]
    8. Using strategy rm
    9. Applied div-inv5.5

      \[\leadsto \frac{\frac{a2}{\color{blue}{b1 \cdot \frac{1}{a1}}}}{b2}\]
    10. Applied *-un-lft-identity5.5

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

      \[\leadsto \frac{\color{blue}{\frac{1}{b1} \cdot \frac{a2}{\frac{1}{a1}}}}{b2}\]
    12. Applied associate-/l*8.2

      \[\leadsto \color{blue}{\frac{\frac{1}{b1}}{\frac{b2}{\frac{a2}{\frac{1}{a1}}}}}\]
    13. Simplified5.5

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

    if -3.2418970626461063e+149 < (* b1 b2) < -1.0084599578011689e-263 or 3.019673003289364e-116 < (* b1 b2) < 2.5857146802439288e+182

    1. Initial program 3.8

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

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

    if -1.0084599578011689e-263 < (* b1 b2) < 3.019673003289364e-116

    1. Initial program 28.0

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

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

      \[\leadsto \frac{\frac{a1 \cdot a2}{b1}}{\color{blue}{1 \cdot b2}}\]
    6. Applied associate-/r*15.4

      \[\leadsto \color{blue}{\frac{\frac{\frac{a1 \cdot a2}{b1}}{1}}{b2}}\]
    7. Simplified10.0

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;b1 \cdot b2 \le -3.2418970626461063 \cdot 10^{+149}:\\ \;\;\;\;\frac{\frac{1}{b1}}{\frac{\frac{b2}{a1}}{a2}}\\ \mathbf{elif}\;b1 \cdot b2 \le -1.0084599578011689 \cdot 10^{-263}:\\ \;\;\;\;\frac{a1}{\frac{b1 \cdot b2}{a2}}\\ \mathbf{elif}\;b1 \cdot b2 \le 3.019673003289364 \cdot 10^{-116}:\\ \;\;\;\;\frac{\frac{a2}{\frac{b1}{a1}}}{b2}\\ \mathbf{elif}\;b1 \cdot b2 \le 2.5857146802439288 \cdot 10^{+182}:\\ \;\;\;\;\frac{a1}{\frac{b1 \cdot b2}{a2}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{1}{b1}}{\frac{\frac{b2}{a1}}{a2}}\\ \end{array}\]

Reproduce

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

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

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