Average Error: 11.3 → 2.6
Time: 12.3s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -4.331097236289201929838111566058261923975 \cdot 10^{-312} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 0.0\right) \land \frac{a1 \cdot a2}{b1 \cdot b2} \le 2.759064889840746628621735483350290847538 \cdot 10^{303}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a2}{b2} \cdot \frac{a1}{b1}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\
\;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\

\mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -4.331097236289201929838111566058261923975 \cdot 10^{-312} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 0.0\right) \land \frac{a1 \cdot a2}{b1 \cdot b2} \le 2.759064889840746628621735483350290847538 \cdot 10^{303}:\\
\;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r189565 = a1;
        double r189566 = a2;
        double r189567 = r189565 * r189566;
        double r189568 = b1;
        double r189569 = b2;
        double r189570 = r189568 * r189569;
        double r189571 = r189567 / r189570;
        return r189571;
}

double f(double a1, double a2, double b1, double b2) {
        double r189572 = a1;
        double r189573 = a2;
        double r189574 = r189572 * r189573;
        double r189575 = b1;
        double r189576 = b2;
        double r189577 = r189575 * r189576;
        double r189578 = r189574 / r189577;
        double r189579 = -inf.0;
        bool r189580 = r189578 <= r189579;
        double r189581 = r189574 / r189575;
        double r189582 = r189581 / r189576;
        double r189583 = -4.3310972362892e-312;
        bool r189584 = r189578 <= r189583;
        double r189585 = 0.0;
        bool r189586 = r189578 <= r189585;
        double r189587 = !r189586;
        double r189588 = 2.7590648898407466e+303;
        bool r189589 = r189578 <= r189588;
        bool r189590 = r189587 && r189589;
        bool r189591 = r189584 || r189590;
        double r189592 = r189573 / r189576;
        double r189593 = r189572 / r189575;
        double r189594 = r189592 * r189593;
        double r189595 = r189591 ? r189578 : r189594;
        double r189596 = r189580 ? r189582 : r189595;
        return r189596;
}

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.6
\[\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*28.8

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

    if -inf.0 < (/ (* a1 a2) (* b1 b2)) < -4.3310972362892e-312 or 0.0 < (/ (* a1 a2) (* b1 b2)) < 2.7590648898407466e+303

    1. Initial program 3.4

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

    if -4.3310972362892e-312 < (/ (* a1 a2) (* b1 b2)) < 0.0 or 2.7590648898407466e+303 < (/ (* a1 a2) (* b1 b2))

    1. Initial program 29.3

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
    2. Taylor expanded around 0 29.3

      \[\leadsto \color{blue}{\frac{a1 \cdot a2}{b2 \cdot b1}}\]
    3. Simplified3.6

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

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

Reproduce

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

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

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