Average Error: 11.5 → 4.7
Time: 3.6s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -8.1576239880029206 \cdot 10^{195}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -7.6760268479022844 \cdot 10^{-278}:\\ \;\;\;\;\frac{a1 \cdot a2}{\sqrt[3]{b2} \cdot \sqrt[3]{b2}} \cdot \frac{\frac{1}{b1}}{\sqrt[3]{b2}}\\ \mathbf{elif}\;a1 \cdot a2 \le 1.3851302523781732 \cdot 10^{-273}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 2.0507310125992406 \cdot 10^{162}:\\ \;\;\;\;\frac{a1 \cdot a2}{\sqrt[3]{b2} \cdot \sqrt[3]{b2}} \cdot \frac{\frac{1}{b1}}{\sqrt[3]{b2}}\\ \mathbf{else}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;a1 \cdot a2 \le -8.1576239880029206 \cdot 10^{195}:\\
\;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\

\mathbf{elif}\;a1 \cdot a2 \le -7.6760268479022844 \cdot 10^{-278}:\\
\;\;\;\;\frac{a1 \cdot a2}{\sqrt[3]{b2} \cdot \sqrt[3]{b2}} \cdot \frac{\frac{1}{b1}}{\sqrt[3]{b2}}\\

\mathbf{elif}\;a1 \cdot a2 \le 1.3851302523781732 \cdot 10^{-273}:\\
\;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\

\mathbf{elif}\;a1 \cdot a2 \le 2.0507310125992406 \cdot 10^{162}:\\
\;\;\;\;\frac{a1 \cdot a2}{\sqrt[3]{b2} \cdot \sqrt[3]{b2}} \cdot \frac{\frac{1}{b1}}{\sqrt[3]{b2}}\\

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r136026 = a1;
        double r136027 = a2;
        double r136028 = r136026 * r136027;
        double r136029 = b1;
        double r136030 = b2;
        double r136031 = r136029 * r136030;
        double r136032 = r136028 / r136031;
        return r136032;
}

double f(double a1, double a2, double b1, double b2) {
        double r136033 = a1;
        double r136034 = a2;
        double r136035 = r136033 * r136034;
        double r136036 = -8.157623988002921e+195;
        bool r136037 = r136035 <= r136036;
        double r136038 = b1;
        double r136039 = r136034 / r136038;
        double r136040 = b2;
        double r136041 = r136039 / r136040;
        double r136042 = r136033 * r136041;
        double r136043 = -7.676026847902284e-278;
        bool r136044 = r136035 <= r136043;
        double r136045 = cbrt(r136040);
        double r136046 = r136045 * r136045;
        double r136047 = r136035 / r136046;
        double r136048 = 1.0;
        double r136049 = r136048 / r136038;
        double r136050 = r136049 / r136045;
        double r136051 = r136047 * r136050;
        double r136052 = 1.3851302523781732e-273;
        bool r136053 = r136035 <= r136052;
        double r136054 = r136033 / r136038;
        double r136055 = r136034 / r136040;
        double r136056 = r136054 * r136055;
        double r136057 = 2.0507310125992406e+162;
        bool r136058 = r136035 <= r136057;
        double r136059 = r136058 ? r136051 : r136042;
        double r136060 = r136053 ? r136056 : r136059;
        double r136061 = r136044 ? r136051 : r136060;
        double r136062 = r136037 ? r136042 : r136061;
        return r136062;
}

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

Derivation

  1. Split input into 3 regimes
  2. if (* a1 a2) < -8.157623988002921e+195 or 2.0507310125992406e+162 < (* a1 a2)

    1. Initial program 30.8

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

      \[\leadsto \color{blue}{\frac{\frac{a1 \cdot a2}{b1}}{b2}}\]
    4. Using strategy rm
    5. Applied *-un-lft-identity31.9

      \[\leadsto \frac{\frac{a1 \cdot a2}{b1}}{\color{blue}{1 \cdot b2}}\]
    6. Applied *-un-lft-identity31.9

      \[\leadsto \frac{\frac{a1 \cdot a2}{\color{blue}{1 \cdot b1}}}{1 \cdot b2}\]
    7. Applied times-frac18.2

      \[\leadsto \frac{\color{blue}{\frac{a1}{1} \cdot \frac{a2}{b1}}}{1 \cdot b2}\]
    8. Applied times-frac11.8

      \[\leadsto \color{blue}{\frac{\frac{a1}{1}}{1} \cdot \frac{\frac{a2}{b1}}{b2}}\]
    9. Simplified11.8

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

    if -8.157623988002921e+195 < (* a1 a2) < -7.676026847902284e-278 or 1.3851302523781732e-273 < (* a1 a2) < 2.0507310125992406e+162

    1. Initial program 5.0

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

      \[\leadsto \color{blue}{\frac{\frac{a1 \cdot a2}{b1}}{b2}}\]
    4. Using strategy rm
    5. Applied add-cube-cbrt5.4

      \[\leadsto \frac{\frac{a1 \cdot a2}{b1}}{\color{blue}{\left(\sqrt[3]{b2} \cdot \sqrt[3]{b2}\right) \cdot \sqrt[3]{b2}}}\]
    6. Applied div-inv5.4

      \[\leadsto \frac{\color{blue}{\left(a1 \cdot a2\right) \cdot \frac{1}{b1}}}{\left(\sqrt[3]{b2} \cdot \sqrt[3]{b2}\right) \cdot \sqrt[3]{b2}}\]
    7. Applied times-frac3.5

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

    if -7.676026847902284e-278 < (* a1 a2) < 1.3851302523781732e-273

    1. Initial program 18.1

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

      \[\leadsto \color{blue}{\frac{a1}{b1} \cdot \frac{a2}{b2}}\]
  3. Recombined 3 regimes into one program.
  4. Final simplification4.7

    \[\leadsto \begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -8.1576239880029206 \cdot 10^{195}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -7.6760268479022844 \cdot 10^{-278}:\\ \;\;\;\;\frac{a1 \cdot a2}{\sqrt[3]{b2} \cdot \sqrt[3]{b2}} \cdot \frac{\frac{1}{b1}}{\sqrt[3]{b2}}\\ \mathbf{elif}\;a1 \cdot a2 \le 1.3851302523781732 \cdot 10^{-273}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 2.0507310125992406 \cdot 10^{162}:\\ \;\;\;\;\frac{a1 \cdot a2}{\sqrt[3]{b2} \cdot \sqrt[3]{b2}} \cdot \frac{\frac{1}{b1}}{\sqrt[3]{b2}}\\ \mathbf{else}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \end{array}\]

Reproduce

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

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

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