Average Error: 11.3 → 3.2
Time: 2.8m
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}{\frac{b1}{a1}}}{\frac{b2}{a2}}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -1.467391042233376 \cdot 10^{-284}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -0.0:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 3.9728063804597205 \cdot 10^{+288}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \end{array}\]
double f(double a1, double a2, double b1, double b2) {
        double r31200296 = a1;
        double r31200297 = a2;
        double r31200298 = r31200296 * r31200297;
        double r31200299 = b1;
        double r31200300 = b2;
        double r31200301 = r31200299 * r31200300;
        double r31200302 = r31200298 / r31200301;
        return r31200302;
}

double f(double a1, double a2, double b1, double b2) {
        double r31200303 = a1;
        double r31200304 = a2;
        double r31200305 = r31200303 * r31200304;
        double r31200306 = b1;
        double r31200307 = b2;
        double r31200308 = r31200306 * r31200307;
        double r31200309 = r31200305 / r31200308;
        double r31200310 = -inf.0;
        bool r31200311 = r31200309 <= r31200310;
        double r31200312 = 1.0;
        double r31200313 = r31200306 / r31200303;
        double r31200314 = r31200312 / r31200313;
        double r31200315 = r31200307 / r31200304;
        double r31200316 = r31200314 / r31200315;
        double r31200317 = -1.467391042233376e-284;
        bool r31200318 = r31200309 <= r31200317;
        double r31200319 = -0.0;
        bool r31200320 = r31200309 <= r31200319;
        double r31200321 = r31200304 / r31200306;
        double r31200322 = r31200321 / r31200307;
        double r31200323 = r31200303 * r31200322;
        double r31200324 = 3.9728063804597205e+288;
        bool r31200325 = r31200309 <= r31200324;
        double r31200326 = r31200325 ? r31200309 : r31200323;
        double r31200327 = r31200320 ? r31200323 : r31200326;
        double r31200328 = r31200318 ? r31200309 : r31200327;
        double r31200329 = r31200311 ? r31200316 : r31200328;
        return r31200329;
}

\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\
\;\;\;\;\frac{\frac{1}{\frac{b1}{a1}}}{\frac{b2}{a2}}\\

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

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

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

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

\end{array}

Error

Bits error versus a1

Bits error versus a2

Bits error versus b1

Bits error versus b2

Target

Original11.3
Target10.7
Herbie3.2
\[\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 60.0

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

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

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

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

    if -inf.0 < (/ (* a1 a2) (* b1 b2)) < -1.467391042233376e-284 or -0.0 < (/ (* a1 a2) (* b1 b2)) < 3.9728063804597205e+288

    1. Initial program 0.8

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

    if -1.467391042233376e-284 < (/ (* a1 a2) (* b1 b2)) < -0.0 or 3.9728063804597205e+288 < (/ (* a1 a2) (* b1 b2))

    1. Initial program 22.4

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

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

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

      \[\leadsto \frac{1}{\color{blue}{1 \cdot \frac{\frac{b1 \cdot b2}{a1}}{a2}}}\]
    8. Applied add-sqr-sqrt15.4

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

      \[\leadsto \color{blue}{\frac{\sqrt{1}}{1} \cdot \frac{\sqrt{1}}{\frac{\frac{b1 \cdot b2}{a1}}{a2}}}\]
    10. Simplified15.4

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\ \;\;\;\;\frac{\frac{1}{\frac{b1}{a1}}}{\frac{b2}{a2}}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -1.467391042233376 \cdot 10^{-284}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -0.0:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 3.9728063804597205 \cdot 10^{+288}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \end{array}\]

Reproduce

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

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

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