Average Error: 11.3 → 2.6
Time: 11.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{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{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{\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{a1}{b1} \cdot \frac{a2}{b2}\\

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r185570 = a1;
        double r185571 = a2;
        double r185572 = r185570 * r185571;
        double r185573 = b1;
        double r185574 = b2;
        double r185575 = r185573 * r185574;
        double r185576 = r185572 / r185575;
        return r185576;
}

double f(double a1, double a2, double b1, double b2) {
        double r185577 = a1;
        double r185578 = a2;
        double r185579 = r185577 * r185578;
        double r185580 = b1;
        double r185581 = b2;
        double r185582 = r185580 * r185581;
        double r185583 = r185579 / r185582;
        double r185584 = -inf.0;
        bool r185585 = r185583 <= r185584;
        double r185586 = r185579 / r185580;
        double r185587 = r185586 / r185581;
        double r185588 = -4.3310972362892e-312;
        bool r185589 = r185583 <= r185588;
        double r185590 = 0.0;
        bool r185591 = r185583 <= r185590;
        double r185592 = !r185591;
        double r185593 = 2.7590648898407466e+303;
        bool r185594 = r185583 <= r185593;
        bool r185595 = r185592 && r185594;
        bool r185596 = r185589 || r185595;
        double r185597 = r185577 / r185580;
        double r185598 = r185578 / r185581;
        double r185599 = r185597 * r185598;
        double r185600 = r185596 ? r185583 : r185599;
        double r185601 = r185585 ? r185587 : r185600;
        return r185601;
}

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. Using strategy rm
    3. Applied times-frac3.6

      \[\leadsto \color{blue}{\frac{a1}{b1} \cdot \frac{a2}{b2}}\]
  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{a1}{b1} \cdot \frac{a2}{b2}\\ \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)))