Average Error: 11.5 → 3.8
Time: 3.3s
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 r151039 = a1;
        double r151040 = a2;
        double r151041 = r151039 * r151040;
        double r151042 = b1;
        double r151043 = b2;
        double r151044 = r151042 * r151043;
        double r151045 = r151041 / r151044;
        return r151045;
}

double f(double a1, double a2, double b1, double b2) {
        double r151046 = a1;
        double r151047 = a2;
        double r151048 = r151046 * r151047;
        double r151049 = b1;
        double r151050 = b2;
        double r151051 = r151049 * r151050;
        double r151052 = r151048 / r151051;
        double r151053 = -inf.0;
        bool r151054 = r151052 <= r151053;
        double r151055 = -4.2602034138658774e-231;
        bool r151056 = r151052 <= r151055;
        double r151057 = 7.1004747480539075e-168;
        bool r151058 = r151052 <= r151057;
        double r151059 = 3.708342445349794e+294;
        bool r151060 = r151052 <= r151059;
        double r151061 = !r151060;
        bool r151062 = r151058 || r151061;
        double r151063 = !r151062;
        bool r151064 = r151056 || r151063;
        double r151065 = !r151064;
        bool r151066 = r151054 || r151065;
        double r151067 = r151046 / r151049;
        double r151068 = r151047 / r151050;
        double r151069 = r151067 * r151068;
        double r151070 = r151066 ? r151069 : r151052;
        return r151070;
}

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 
(FPCore (a1 a2 b1 b2)
  :name "Quotient of products"
  :precision binary64

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

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