Average Error: 11.3 → 3.1
Time: 12.6s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\ \;\;\;\;\frac{a1 \cdot \frac{a2}{b2}}{b1}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -8.843324609247471005376211875053257441102 \cdot 10^{-307}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -0.0:\\ \;\;\;\;\frac{a1 \cdot \frac{a2}{b2}}{b1}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 1.464542161086205916851616380334111321007 \cdot 10^{288}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{a1}{b1} \cdot 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{a1 \cdot \frac{a2}{b2}}{b1}\\

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

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

\mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 1.464542161086205916851616380334111321007 \cdot 10^{288}:\\
\;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r127592 = a1;
        double r127593 = a2;
        double r127594 = r127592 * r127593;
        double r127595 = b1;
        double r127596 = b2;
        double r127597 = r127595 * r127596;
        double r127598 = r127594 / r127597;
        return r127598;
}

double f(double a1, double a2, double b1, double b2) {
        double r127599 = a1;
        double r127600 = a2;
        double r127601 = r127599 * r127600;
        double r127602 = b1;
        double r127603 = b2;
        double r127604 = r127602 * r127603;
        double r127605 = r127601 / r127604;
        double r127606 = -inf.0;
        bool r127607 = r127605 <= r127606;
        double r127608 = r127600 / r127603;
        double r127609 = r127599 * r127608;
        double r127610 = r127609 / r127602;
        double r127611 = -8.843324609247471e-307;
        bool r127612 = r127605 <= r127611;
        double r127613 = -0.0;
        bool r127614 = r127605 <= r127613;
        double r127615 = 1.464542161086206e+288;
        bool r127616 = r127605 <= r127615;
        double r127617 = r127599 / r127602;
        double r127618 = r127617 * r127600;
        double r127619 = r127618 / r127603;
        double r127620 = r127616 ? r127605 : r127619;
        double r127621 = r127614 ? r127610 : r127620;
        double r127622 = r127612 ? r127605 : r127621;
        double r127623 = r127607 ? r127610 : r127622;
        return r127623;
}

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

Derivation

  1. Split input into 3 regimes
  2. if (/ (* a1 a2) (* b1 b2)) < -inf.0 or -8.843324609247471e-307 < (/ (* a1 a2) (* b1 b2)) < -0.0

    1. Initial program 18.3

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

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

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

    if -inf.0 < (/ (* a1 a2) (* b1 b2)) < -8.843324609247471e-307 or -0.0 < (/ (* a1 a2) (* b1 b2)) < 1.464542161086206e+288

    1. Initial program 0.8

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

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

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

      \[\leadsto \color{blue}{\left(\frac{a1}{b1} \cdot a2\right) \cdot \frac{1}{b2}}\]
    7. Using strategy rm
    8. Applied un-div-inv14.6

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

      \[\leadsto \frac{\color{blue}{\frac{a1 \cdot a2}{b1}}}{b2}\]
    11. Applied associate-/l/0.8

      \[\leadsto \color{blue}{\frac{a1 \cdot a2}{b2 \cdot b1}}\]
    12. Simplified0.8

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

    if 1.464542161086206e+288 < (/ (* a1 a2) (* b1 b2))

    1. Initial program 59.6

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

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

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

      \[\leadsto \color{blue}{\left(\frac{a1}{b1} \cdot a2\right) \cdot \frac{1}{b2}}\]
    7. Using strategy rm
    8. Applied un-div-inv13.1

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\ \;\;\;\;\frac{a1 \cdot \frac{a2}{b2}}{b1}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -8.843324609247471005376211875053257441102 \cdot 10^{-307}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -0.0:\\ \;\;\;\;\frac{a1 \cdot \frac{a2}{b2}}{b1}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 1.464542161086205916851616380334111321007 \cdot 10^{288}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{a1}{b1} \cdot a2}{b2}\\ \end{array}\]

Reproduce

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

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

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