Average Error: 11.5 → 3.8
Time: 19.5s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;\frac{a2 \cdot a1}{b2 \cdot b1} = -\infty:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;\frac{a2 \cdot a1}{b2 \cdot b1} \le -8.689229871317468393658322463867604866085 \cdot 10^{-264}:\\ \;\;\;\;\frac{a2 \cdot a1}{b2 \cdot b1}\\ \mathbf{elif}\;\frac{a2 \cdot a1}{b2 \cdot b1} \le -0.0:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \mathbf{elif}\;\frac{a2 \cdot a1}{b2 \cdot b1} \le 9.000995610168164344108674672461018222846 \cdot 10^{241}:\\ \;\;\;\;\frac{a2 \cdot a1}{b2 \cdot b1}\\ \mathbf{else}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;\frac{a2 \cdot a1}{b2 \cdot b1} = -\infty:\\
\;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\

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

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

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

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r5622730 = a1;
        double r5622731 = a2;
        double r5622732 = r5622730 * r5622731;
        double r5622733 = b1;
        double r5622734 = b2;
        double r5622735 = r5622733 * r5622734;
        double r5622736 = r5622732 / r5622735;
        return r5622736;
}

double f(double a1, double a2, double b1, double b2) {
        double r5622737 = a2;
        double r5622738 = a1;
        double r5622739 = r5622737 * r5622738;
        double r5622740 = b2;
        double r5622741 = b1;
        double r5622742 = r5622740 * r5622741;
        double r5622743 = r5622739 / r5622742;
        double r5622744 = -inf.0;
        bool r5622745 = r5622743 <= r5622744;
        double r5622746 = r5622738 / r5622741;
        double r5622747 = r5622737 / r5622740;
        double r5622748 = r5622746 * r5622747;
        double r5622749 = -8.689229871317468e-264;
        bool r5622750 = r5622743 <= r5622749;
        double r5622751 = -0.0;
        bool r5622752 = r5622743 <= r5622751;
        double r5622753 = r5622737 / r5622741;
        double r5622754 = r5622753 / r5622740;
        double r5622755 = r5622738 * r5622754;
        double r5622756 = 9.000995610168164e+241;
        bool r5622757 = r5622743 <= r5622756;
        double r5622758 = r5622757 ? r5622743 : r5622755;
        double r5622759 = r5622752 ? r5622755 : r5622758;
        double r5622760 = r5622750 ? r5622743 : r5622759;
        double r5622761 = r5622745 ? r5622748 : r5622760;
        return r5622761;
}

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

Derivation

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

    1. Initial program 64.0

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

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

    if -inf.0 < (/ (* a1 a2) (* b1 b2)) < -8.689229871317468e-264 or -0.0 < (/ (* a1 a2) (* b1 b2)) < 9.000995610168164e+241

    1. Initial program 0.9

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

      \[\leadsto \color{blue}{\frac{a1}{\frac{b1 \cdot b2}{a2}}}\]
    4. Taylor expanded around 0 0.9

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

    if -8.689229871317468e-264 < (/ (* a1 a2) (* b1 b2)) < -0.0 or 9.000995610168164e+241 < (/ (* a1 a2) (* b1 b2))

    1. Initial program 20.9

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

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{a2 \cdot a1}{b2 \cdot b1} = -\infty:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;\frac{a2 \cdot a1}{b2 \cdot b1} \le -8.689229871317468393658322463867604866085 \cdot 10^{-264}:\\ \;\;\;\;\frac{a2 \cdot a1}{b2 \cdot b1}\\ \mathbf{elif}\;\frac{a2 \cdot a1}{b2 \cdot b1} \le -0.0:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \mathbf{elif}\;\frac{a2 \cdot a1}{b2 \cdot b1} \le 9.000995610168164344108674672461018222846 \cdot 10^{241}:\\ \;\;\;\;\frac{a2 \cdot a1}{b2 \cdot b1}\\ \mathbf{else}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \end{array}\]

Reproduce

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

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

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