Average Error: 11.4 → 11.1
Time: 6.9s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;b1 \le -5.383202245290986 \cdot 10^{-156}:\\ \;\;\;\;a1 \cdot \frac{a2}{b2 \cdot b1}\\ \mathbf{elif}\;b1 \le 6.891101720226247 \cdot 10^{-295}:\\ \;\;\;\;\frac{\frac{a1}{b1} \cdot a2}{b2}\\ \mathbf{elif}\;b1 \le 3.3978834778078136 \cdot 10^{-255}:\\ \;\;\;\;a1 \cdot \frac{a2}{b2 \cdot b1}\\ \mathbf{elif}\;b1 \le 2.5097248616828304 \cdot 10^{-195}:\\ \;\;\;\;\frac{a1 \cdot \frac{a2}{b2}}{b1}\\ \mathbf{elif}\;b1 \le 153.50401013691055:\\ \;\;\;\;\frac{\frac{a1}{b1} \cdot a2}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1 \cdot \frac{a2}{b2}}{b1}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;b1 \le -5.383202245290986 \cdot 10^{-156}:\\
\;\;\;\;a1 \cdot \frac{a2}{b2 \cdot b1}\\

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

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

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

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

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r3309977 = a1;
        double r3309978 = a2;
        double r3309979 = r3309977 * r3309978;
        double r3309980 = b1;
        double r3309981 = b2;
        double r3309982 = r3309980 * r3309981;
        double r3309983 = r3309979 / r3309982;
        return r3309983;
}

double f(double a1, double a2, double b1, double b2) {
        double r3309984 = b1;
        double r3309985 = -5.383202245290986e-156;
        bool r3309986 = r3309984 <= r3309985;
        double r3309987 = a1;
        double r3309988 = a2;
        double r3309989 = b2;
        double r3309990 = r3309989 * r3309984;
        double r3309991 = r3309988 / r3309990;
        double r3309992 = r3309987 * r3309991;
        double r3309993 = 6.891101720226247e-295;
        bool r3309994 = r3309984 <= r3309993;
        double r3309995 = r3309987 / r3309984;
        double r3309996 = r3309995 * r3309988;
        double r3309997 = r3309996 / r3309989;
        double r3309998 = 3.3978834778078136e-255;
        bool r3309999 = r3309984 <= r3309998;
        double r3310000 = 2.5097248616828304e-195;
        bool r3310001 = r3309984 <= r3310000;
        double r3310002 = r3309988 / r3309989;
        double r3310003 = r3309987 * r3310002;
        double r3310004 = r3310003 / r3309984;
        double r3310005 = 153.50401013691055;
        bool r3310006 = r3309984 <= r3310005;
        double r3310007 = r3310006 ? r3309997 : r3310004;
        double r3310008 = r3310001 ? r3310004 : r3310007;
        double r3310009 = r3309999 ? r3309992 : r3310008;
        double r3310010 = r3309994 ? r3309997 : r3310009;
        double r3310011 = r3309986 ? r3309992 : r3310010;
        return r3310011;
}

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

Derivation

  1. Split input into 3 regimes
  2. if b1 < -5.383202245290986e-156 or 6.891101720226247e-295 < b1 < 3.3978834778078136e-255

    1. Initial program 10.5

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

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

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

      \[\leadsto \color{blue}{a1 \cdot \left(\frac{1}{b1} \cdot \frac{a2}{b2}\right)}\]
    7. Simplified10.1

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

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

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

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

    if -5.383202245290986e-156 < b1 < 6.891101720226247e-295 or 2.5097248616828304e-195 < b1 < 153.50401013691055

    1. Initial program 13.5

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

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

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

    if 3.3978834778078136e-255 < b1 < 2.5097248616828304e-195 or 153.50401013691055 < b1

    1. Initial program 10.8

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;b1 \le -5.383202245290986 \cdot 10^{-156}:\\ \;\;\;\;a1 \cdot \frac{a2}{b2 \cdot b1}\\ \mathbf{elif}\;b1 \le 6.891101720226247 \cdot 10^{-295}:\\ \;\;\;\;\frac{\frac{a1}{b1} \cdot a2}{b2}\\ \mathbf{elif}\;b1 \le 3.3978834778078136 \cdot 10^{-255}:\\ \;\;\;\;a1 \cdot \frac{a2}{b2 \cdot b1}\\ \mathbf{elif}\;b1 \le 2.5097248616828304 \cdot 10^{-195}:\\ \;\;\;\;\frac{a1 \cdot \frac{a2}{b2}}{b1}\\ \mathbf{elif}\;b1 \le 153.50401013691055:\\ \;\;\;\;\frac{\frac{a1}{b1} \cdot a2}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1 \cdot \frac{a2}{b2}}{b1}\\ \end{array}\]

Reproduce

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

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

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