Average Error: 11.1 → 2.3
Time: 9.2s
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 -3.721065323848875903560093256362069823088 \cdot 10^{-309} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 0.0\right) \land \frac{a1 \cdot a2}{b1 \cdot b2} \le 8.682799991236733148187736602059382241979 \cdot 10^{294}\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 -3.721065323848875903560093256362069823088 \cdot 10^{-309} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 0.0\right) \land \frac{a1 \cdot a2}{b1 \cdot b2} \le 8.682799991236733148187736602059382241979 \cdot 10^{294}\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 r132731 = a1;
        double r132732 = a2;
        double r132733 = r132731 * r132732;
        double r132734 = b1;
        double r132735 = b2;
        double r132736 = r132734 * r132735;
        double r132737 = r132733 / r132736;
        return r132737;
}

double f(double a1, double a2, double b1, double b2) {
        double r132738 = a1;
        double r132739 = a2;
        double r132740 = r132738 * r132739;
        double r132741 = b1;
        double r132742 = b2;
        double r132743 = r132741 * r132742;
        double r132744 = r132740 / r132743;
        double r132745 = -inf.0;
        bool r132746 = r132744 <= r132745;
        double r132747 = -3.721065323848876e-309;
        bool r132748 = r132744 <= r132747;
        double r132749 = 0.0;
        bool r132750 = r132744 <= r132749;
        double r132751 = !r132750;
        double r132752 = 8.682799991236733e+294;
        bool r132753 = r132744 <= r132752;
        bool r132754 = r132751 && r132753;
        bool r132755 = r132748 || r132754;
        double r132756 = !r132755;
        bool r132757 = r132746 || r132756;
        double r132758 = r132738 / r132741;
        double r132759 = r132739 / r132742;
        double r132760 = r132758 * r132759;
        double r132761 = r132757 ? r132760 : r132744;
        return r132761;
}

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

Derivation

  1. Split input into 2 regimes
  2. if (/ (* a1 a2) (* b1 b2)) < -inf.0 or -3.721065323848876e-309 < (/ (* a1 a2) (* b1 b2)) < 0.0 or 8.682799991236733e+294 < (/ (* a1 a2) (* b1 b2))

    1. Initial program 32.8

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

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

    if -inf.0 < (/ (* a1 a2) (* b1 b2)) < -3.721065323848876e-309 or 0.0 < (/ (* a1 a2) (* b1 b2)) < 8.682799991236733e+294

    1. Initial program 3.5

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

    \[\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 -3.721065323848875903560093256362069823088 \cdot 10^{-309} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 0.0\right) \land \frac{a1 \cdot a2}{b1 \cdot b2} \le 8.682799991236733148187736602059382241979 \cdot 10^{294}\right):\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \end{array}\]

Reproduce

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

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

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