Average Error: 11.6 → 5.0
Time: 9.4s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -4.295262739202245039131130912309167502672 \cdot 10^{244}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -2.007504316727393710931951094013571648268 \cdot 10^{-192}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 4.005070037874945688454093389847452370632 \cdot 10^{-123}:\\ \;\;\;\;\frac{a1}{\sqrt[3]{b2} \cdot \sqrt[3]{b2}} \cdot \frac{\frac{a2}{b1}}{\sqrt[3]{b2}}\\ \mathbf{elif}\;a1 \cdot a2 \le 4.152278219639707545525802866459256457129 \cdot 10^{229}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;a1 \cdot a2 \le -4.295262739202245039131130912309167502672 \cdot 10^{244}:\\
\;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\

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

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

\mathbf{elif}\;a1 \cdot a2 \le 4.152278219639707545525802866459256457129 \cdot 10^{229}:\\
\;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r79930 = a1;
        double r79931 = a2;
        double r79932 = r79930 * r79931;
        double r79933 = b1;
        double r79934 = b2;
        double r79935 = r79933 * r79934;
        double r79936 = r79932 / r79935;
        return r79936;
}

double f(double a1, double a2, double b1, double b2) {
        double r79937 = a1;
        double r79938 = a2;
        double r79939 = r79937 * r79938;
        double r79940 = -4.295262739202245e+244;
        bool r79941 = r79939 <= r79940;
        double r79942 = b1;
        double r79943 = r79937 / r79942;
        double r79944 = b2;
        double r79945 = r79938 / r79944;
        double r79946 = r79943 * r79945;
        double r79947 = -2.0075043167273937e-192;
        bool r79948 = r79939 <= r79947;
        double r79949 = r79939 / r79942;
        double r79950 = r79949 / r79944;
        double r79951 = 4.005070037874946e-123;
        bool r79952 = r79939 <= r79951;
        double r79953 = cbrt(r79944);
        double r79954 = r79953 * r79953;
        double r79955 = r79937 / r79954;
        double r79956 = r79938 / r79942;
        double r79957 = r79956 / r79953;
        double r79958 = r79955 * r79957;
        double r79959 = 4.1522782196397075e+229;
        bool r79960 = r79939 <= r79959;
        double r79961 = r79960 ? r79950 : r79946;
        double r79962 = r79952 ? r79958 : r79961;
        double r79963 = r79948 ? r79950 : r79962;
        double r79964 = r79941 ? r79946 : r79963;
        return r79964;
}

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.6
Target10.9
Herbie5.0
\[\frac{a1}{b1} \cdot \frac{a2}{b2}\]

Derivation

  1. Split input into 3 regimes
  2. if (* a1 a2) < -4.295262739202245e+244 or 4.1522782196397075e+229 < (* a1 a2)

    1. Initial program 42.5

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

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

    if -4.295262739202245e+244 < (* a1 a2) < -2.0075043167273937e-192 or 4.005070037874946e-123 < (* a1 a2) < 4.1522782196397075e+229

    1. Initial program 4.8

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

      \[\leadsto \color{blue}{\frac{\frac{a1 \cdot a2}{b1}}{b2}}\]
    4. Using strategy rm
    5. Applied div-inv4.6

      \[\leadsto \frac{\color{blue}{\left(a1 \cdot a2\right) \cdot \frac{1}{b1}}}{b2}\]
    6. Using strategy rm
    7. Applied pow14.6

      \[\leadsto \frac{\left(a1 \cdot a2\right) \cdot \color{blue}{{\left(\frac{1}{b1}\right)}^{1}}}{b2}\]
    8. Applied pow14.6

      \[\leadsto \frac{\left(a1 \cdot \color{blue}{{a2}^{1}}\right) \cdot {\left(\frac{1}{b1}\right)}^{1}}{b2}\]
    9. Applied pow14.6

      \[\leadsto \frac{\left(\color{blue}{{a1}^{1}} \cdot {a2}^{1}\right) \cdot {\left(\frac{1}{b1}\right)}^{1}}{b2}\]
    10. Applied pow-prod-down4.6

      \[\leadsto \frac{\color{blue}{{\left(a1 \cdot a2\right)}^{1}} \cdot {\left(\frac{1}{b1}\right)}^{1}}{b2}\]
    11. Applied pow-prod-down4.6

      \[\leadsto \frac{\color{blue}{{\left(\left(a1 \cdot a2\right) \cdot \frac{1}{b1}\right)}^{1}}}{b2}\]
    12. Simplified4.5

      \[\leadsto \frac{{\color{blue}{\left(\frac{a1 \cdot a2}{b1}\right)}}^{1}}{b2}\]

    if -2.0075043167273937e-192 < (* a1 a2) < 4.005070037874946e-123

    1. Initial program 13.7

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

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

      \[\leadsto \frac{\frac{a1 \cdot a2}{b1}}{\color{blue}{\left(\sqrt[3]{b2} \cdot \sqrt[3]{b2}\right) \cdot \sqrt[3]{b2}}}\]
    6. Applied *-un-lft-identity13.5

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

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -4.295262739202245039131130912309167502672 \cdot 10^{244}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -2.007504316727393710931951094013571648268 \cdot 10^{-192}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 4.005070037874945688454093389847452370632 \cdot 10^{-123}:\\ \;\;\;\;\frac{a1}{\sqrt[3]{b2} \cdot \sqrt[3]{b2}} \cdot \frac{\frac{a2}{b1}}{\sqrt[3]{b2}}\\ \mathbf{elif}\;a1 \cdot a2 \le 4.152278219639707545525802866459256457129 \cdot 10^{229}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \end{array}\]

Reproduce

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

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

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