Average Error: 11.3 → 4.4
Time: 6.7s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\ \;\;\;\;\frac{\frac{1}{b1}}{\frac{b2}{a1 \cdot a2}}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -1.10177 \cdot 10^{-321} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le -0.0\right) \land \frac{a1 \cdot a2}{b1 \cdot b2} \le 7.0793136520278167 \cdot 10^{246}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{a1}{\frac{b1}{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{\frac{1}{b1}}{\frac{b2}{a1 \cdot a2}}\\

\mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -1.10177 \cdot 10^{-321} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le -0.0\right) \land \frac{a1 \cdot a2}{b1 \cdot b2} \le 7.0793136520278167 \cdot 10^{246}:\\
\;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r152232 = a1;
        double r152233 = a2;
        double r152234 = r152232 * r152233;
        double r152235 = b1;
        double r152236 = b2;
        double r152237 = r152235 * r152236;
        double r152238 = r152234 / r152237;
        return r152238;
}

double f(double a1, double a2, double b1, double b2) {
        double r152239 = a1;
        double r152240 = a2;
        double r152241 = r152239 * r152240;
        double r152242 = b1;
        double r152243 = b2;
        double r152244 = r152242 * r152243;
        double r152245 = r152241 / r152244;
        double r152246 = -inf.0;
        bool r152247 = r152245 <= r152246;
        double r152248 = 1.0;
        double r152249 = r152248 / r152242;
        double r152250 = r152243 / r152241;
        double r152251 = r152249 / r152250;
        double r152252 = -1.101766390226e-321;
        bool r152253 = r152245 <= r152252;
        double r152254 = -0.0;
        bool r152255 = r152245 <= r152254;
        double r152256 = !r152255;
        double r152257 = 7.079313652027817e+246;
        bool r152258 = r152245 <= r152257;
        bool r152259 = r152256 && r152258;
        bool r152260 = r152253 || r152259;
        double r152261 = r152242 / r152240;
        double r152262 = r152239 / r152261;
        double r152263 = r152262 / r152243;
        double r152264 = r152260 ? r152245 : r152263;
        double r152265 = r152247 ? r152251 : r152264;
        return r152265;
}

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
Target11.3
Herbie4.4
\[\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 associate-/r*36.9

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

      \[\leadsto \frac{\color{blue}{\frac{a1}{\frac{b1}{a2}}}}{b2}\]
    6. Using strategy rm
    7. Applied div-inv19.1

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

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

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

      \[\leadsto \color{blue}{\frac{\frac{1}{b1}}{\frac{b2}{\frac{a1}{\frac{1}{a2}}}}}\]
    11. Simplified37.0

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

    if -inf.0 < (/ (* a1 a2) (* b1 b2)) < -1.101766390226e-321 or -0.0 < (/ (* a1 a2) (* b1 b2)) < 7.079313652027817e+246

    1. Initial program 0.8

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]

    if -1.101766390226e-321 < (/ (* a1 a2) (* b1 b2)) < -0.0 or 7.079313652027817e+246 < (/ (* a1 a2) (* b1 b2))

    1. Initial program 21.9

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\ \;\;\;\;\frac{\frac{1}{b1}}{\frac{b2}{a1 \cdot a2}}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -1.10177 \cdot 10^{-321} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le -0.0\right) \land \frac{a1 \cdot a2}{b1 \cdot b2} \le 7.0793136520278167 \cdot 10^{246}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{a1}{\frac{b1}{a2}}}{b2}\\ \end{array}\]

Reproduce

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

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

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