Average Error: 11.3 → 2.4
Time: 2.1s
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}{b1}}{b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -3.0991765939 \cdot 10^{-315}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -0.0:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 8.3923045265864167 \cdot 10^{294}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{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}{b1}}{b2}\\

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

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

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

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r102472 = a1;
        double r102473 = a2;
        double r102474 = r102472 * r102473;
        double r102475 = b1;
        double r102476 = b2;
        double r102477 = r102475 * r102476;
        double r102478 = r102474 / r102477;
        return r102478;
}

double f(double a1, double a2, double b1, double b2) {
        double r102479 = a1;
        double r102480 = a2;
        double r102481 = r102479 * r102480;
        double r102482 = b1;
        double r102483 = b2;
        double r102484 = r102482 * r102483;
        double r102485 = r102481 / r102484;
        double r102486 = -inf.0;
        bool r102487 = r102485 <= r102486;
        double r102488 = r102480 / r102482;
        double r102489 = r102479 * r102488;
        double r102490 = r102489 / r102483;
        double r102491 = -3.099176593887e-315;
        bool r102492 = r102485 <= r102491;
        double r102493 = -0.0;
        bool r102494 = r102485 <= r102493;
        double r102495 = r102479 / r102482;
        double r102496 = r102480 / r102483;
        double r102497 = r102495 * r102496;
        double r102498 = 8.392304526586417e+294;
        bool r102499 = r102485 <= r102498;
        double r102500 = r102499 ? r102485 : r102497;
        double r102501 = r102494 ? r102497 : r102500;
        double r102502 = r102492 ? r102485 : r102501;
        double r102503 = r102487 ? r102490 : r102502;
        return r102503;
}

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
Herbie2.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 times-frac11.1

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

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

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

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

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

    if -inf.0 < (/ (* a1 a2) (* b1 b2)) < -3.099176593887e-315 or -0.0 < (/ (* a1 a2) (* b1 b2)) < 8.392304526586417e+294

    1. Initial program 3.8

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

    if -3.099176593887e-315 < (/ (* a1 a2) (* b1 b2)) < -0.0 or 8.392304526586417e+294 < (/ (* a1 a2) (* b1 b2))

    1. Initial program 27.9

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\ \;\;\;\;\frac{a1 \cdot \frac{a2}{b1}}{b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -3.0991765939 \cdot 10^{-315}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -0.0:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 8.3923045265864167 \cdot 10^{294}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \end{array}\]

Reproduce

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

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

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