Average Error: 11.3 → 3.4
Time: 2.9s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -5.629920962654313471604012923529225270914 \cdot 10^{278} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le -1.876356582087465582822541150969070437304 \cdot 10^{-287} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 1.131022317393002517657401368626620541691 \cdot 10^{-246} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 5.499100526970725014397291959470552919566 \cdot 10^{259}\right)\right)\right):\\ \;\;\;\;\frac{\frac{a1}{b1}}{\frac{b2}{a2}}\\ \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} \le -5.629920962654313471604012923529225270914 \cdot 10^{278} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le -1.876356582087465582822541150969070437304 \cdot 10^{-287} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 1.131022317393002517657401368626620541691 \cdot 10^{-246} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 5.499100526970725014397291959470552919566 \cdot 10^{259}\right)\right)\right):\\
\;\;\;\;\frac{\frac{a1}{b1}}{\frac{b2}{a2}}\\

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r145120 = a1;
        double r145121 = a2;
        double r145122 = r145120 * r145121;
        double r145123 = b1;
        double r145124 = b2;
        double r145125 = r145123 * r145124;
        double r145126 = r145122 / r145125;
        return r145126;
}

double f(double a1, double a2, double b1, double b2) {
        double r145127 = a1;
        double r145128 = a2;
        double r145129 = r145127 * r145128;
        double r145130 = b1;
        double r145131 = b2;
        double r145132 = r145130 * r145131;
        double r145133 = r145129 / r145132;
        double r145134 = -5.6299209626543135e+278;
        bool r145135 = r145133 <= r145134;
        double r145136 = -1.8763565820874656e-287;
        bool r145137 = r145133 <= r145136;
        double r145138 = 1.1310223173930025e-246;
        bool r145139 = r145133 <= r145138;
        double r145140 = 5.499100526970725e+259;
        bool r145141 = r145133 <= r145140;
        double r145142 = !r145141;
        bool r145143 = r145139 || r145142;
        double r145144 = !r145143;
        bool r145145 = r145137 || r145144;
        double r145146 = !r145145;
        bool r145147 = r145135 || r145146;
        double r145148 = r145127 / r145130;
        double r145149 = r145131 / r145128;
        double r145150 = r145148 / r145149;
        double r145151 = r145147 ? r145150 : r145133;
        return r145151;
}

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.5
Herbie3.4
\[\frac{a1}{b1} \cdot \frac{a2}{b2}\]

Derivation

  1. Split input into 2 regimes
  2. if (/ (* a1 a2) (* b1 b2)) < -5.6299209626543135e+278 or -1.8763565820874656e-287 < (/ (* a1 a2) (* b1 b2)) < 1.1310223173930025e-246 or 5.499100526970725e+259 < (/ (* a1 a2) (* b1 b2))

    1. Initial program 23.1

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
    2. Using strategy rm
    3. Applied associate-/r*16.0

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

      \[\leadsto \frac{\color{blue}{\frac{a1}{\frac{b1}{a2}}}}{b2}\]
    6. Using strategy rm
    7. Applied associate-/r/8.3

      \[\leadsto \frac{\color{blue}{\frac{a1}{b1} \cdot a2}}{b2}\]
    8. Applied associate-/l*6.4

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

    if -5.6299209626543135e+278 < (/ (* a1 a2) (* b1 b2)) < -1.8763565820874656e-287 or 1.1310223173930025e-246 < (/ (* a1 a2) (* b1 b2)) < 5.499100526970725e+259

    1. Initial program 0.7

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -5.629920962654313471604012923529225270914 \cdot 10^{278} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le -1.876356582087465582822541150969070437304 \cdot 10^{-287} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 1.131022317393002517657401368626620541691 \cdot 10^{-246} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 5.499100526970725014397291959470552919566 \cdot 10^{259}\right)\right)\right):\\ \;\;\;\;\frac{\frac{a1}{b1}}{\frac{b2}{a2}}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \end{array}\]

Reproduce

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

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

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