Average Error: 11.5 → 3.8
Time: 3.4s
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 -4.2602034138658774 \cdot 10^{-231} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 7.10047474805390751 \cdot 10^{-168} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 3.70834244534979421 \cdot 10^{294}\right)\right)\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 -4.2602034138658774 \cdot 10^{-231} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 7.10047474805390751 \cdot 10^{-168} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 3.70834244534979421 \cdot 10^{294}\right)\right)\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 r178845 = a1;
        double r178846 = a2;
        double r178847 = r178845 * r178846;
        double r178848 = b1;
        double r178849 = b2;
        double r178850 = r178848 * r178849;
        double r178851 = r178847 / r178850;
        return r178851;
}

double f(double a1, double a2, double b1, double b2) {
        double r178852 = a1;
        double r178853 = a2;
        double r178854 = r178852 * r178853;
        double r178855 = b1;
        double r178856 = b2;
        double r178857 = r178855 * r178856;
        double r178858 = r178854 / r178857;
        double r178859 = -inf.0;
        bool r178860 = r178858 <= r178859;
        double r178861 = -4.2602034138658774e-231;
        bool r178862 = r178858 <= r178861;
        double r178863 = 7.1004747480539075e-168;
        bool r178864 = r178858 <= r178863;
        double r178865 = 3.708342445349794e+294;
        bool r178866 = r178858 <= r178865;
        double r178867 = !r178866;
        bool r178868 = r178864 || r178867;
        double r178869 = !r178868;
        bool r178870 = r178862 || r178869;
        double r178871 = !r178870;
        bool r178872 = r178860 || r178871;
        double r178873 = r178852 / r178855;
        double r178874 = r178853 / r178856;
        double r178875 = r178873 * r178874;
        double r178876 = r178872 ? r178875 : r178858;
        return r178876;
}

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

Derivation

  1. Split input into 2 regimes
  2. if (/ (* a1 a2) (* b1 b2)) < -inf.0 or -4.2602034138658774e-231 < (/ (* a1 a2) (* b1 b2)) < 7.1004747480539075e-168 or 3.708342445349794e+294 < (/ (* a1 a2) (* b1 b2))

    1. Initial program 21.8

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

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

    if -inf.0 < (/ (* a1 a2) (* b1 b2)) < -4.2602034138658774e-231 or 7.1004747480539075e-168 < (/ (* a1 a2) (* b1 b2)) < 3.708342445349794e+294

    1. Initial program 0.8

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

    \[\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 -4.2602034138658774 \cdot 10^{-231} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 7.10047474805390751 \cdot 10^{-168} \lor \neg \left(\frac{a1 \cdot a2}{b1 \cdot b2} \le 3.70834244534979421 \cdot 10^{294}\right)\right)\right):\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \end{array}\]

Reproduce

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

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

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