Average Error: 11.1 → 2.9
Time: 4.1s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le -6.28254 \cdot 10^{-319} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 1.16422584143949291 \cdot 10^{-290}\right) \land \frac{a1 \cdot a2}{b1 \cdot b2} \le 6.1160527718578736 \cdot 10^{209}\right):\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le -6.28254 \cdot 10^{-319} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 1.16422584143949291 \cdot 10^{-290}\right) \land \frac{a1 \cdot a2}{b1 \cdot b2} \le 6.1160527718578736 \cdot 10^{209}\right):\\
\;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r200730 = a1;
        double r200731 = a2;
        double r200732 = r200730 * r200731;
        double r200733 = b1;
        double r200734 = b2;
        double r200735 = r200733 * r200734;
        double r200736 = r200732 / r200735;
        return r200736;
}

double f(double a1, double a2, double b1, double b2) {
        double r200737 = a1;
        double r200738 = a2;
        double r200739 = r200737 * r200738;
        double r200740 = b1;
        double r200741 = b2;
        double r200742 = r200740 * r200741;
        double r200743 = r200739 / r200742;
        double r200744 = -inf.0;
        bool r200745 = r200743 <= r200744;
        double r200746 = -6.2825387525173e-319;
        bool r200747 = r200743 <= r200746;
        double r200748 = 1.1642258414394929e-290;
        bool r200749 = r200743 <= r200748;
        double r200750 = !r200749;
        double r200751 = 6.1160527718578736e+209;
        bool r200752 = r200743 <= r200751;
        bool r200753 = r200750 && r200752;
        bool r200754 = r200747 || r200753;
        double r200755 = !r200754;
        bool r200756 = r200745 || r200755;
        double r200757 = r200737 / r200740;
        double r200758 = r200738 / r200741;
        double r200759 = r200757 * r200758;
        double r200760 = r200756 ? r200759 : r200743;
        return r200760;
}

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.1
Target11.6
Herbie2.9
\[\frac{a1}{b1} \cdot \frac{a2}{b2}\]

Derivation

  1. Split input into 2 regimes
  2. if (/ (* a1 a2) (* b1 b2)) < -inf.0 or -6.2825387525173e-319 < (/ (* a1 a2) (* b1 b2)) < 1.1642258414394929e-290 or 6.1160527718578736e+209 < (/ (* a1 a2) (* b1 b2))

    1. Initial program 23.1

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

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

    if -inf.0 < (/ (* a1 a2) (* b1 b2)) < -6.2825387525173e-319 or 1.1642258414394929e-290 < (/ (* a1 a2) (* b1 b2)) < 6.1160527718578736e+209

    1. Initial program 0.8

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le -6.28254 \cdot 10^{-319} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 1.16422584143949291 \cdot 10^{-290}\right) \land \frac{a1 \cdot a2}{b1 \cdot b2} \le 6.1160527718578736 \cdot 10^{209}\right):\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \end{array}\]

Reproduce

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

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

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