Average Error: 10.8 → 5.7
Time: 16.0s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -3.023233587679621 \cdot 10^{+251}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -2.1296092868396195 \cdot 10^{-227}:\\ \;\;\;\;\frac{\left(a1 \cdot a2\right) \cdot \frac{1}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 2.887172661957492 \cdot 10^{-160}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 2.1722925108220896 \cdot 10^{+142}:\\ \;\;\;\;\frac{\left(a1 \cdot a2\right) \cdot \frac{1}{b1}}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1 \cdot \frac{a2}{b1}}{b2}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;a1 \cdot a2 \le -3.023233587679621 \cdot 10^{+251}:\\
\;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\

\mathbf{elif}\;a1 \cdot a2 \le -2.1296092868396195 \cdot 10^{-227}:\\
\;\;\;\;\frac{\left(a1 \cdot a2\right) \cdot \frac{1}{b1}}{b2}\\

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

\mathbf{elif}\;a1 \cdot a2 \le 2.1722925108220896 \cdot 10^{+142}:\\
\;\;\;\;\frac{\left(a1 \cdot a2\right) \cdot \frac{1}{b1}}{b2}\\

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r4045830 = a1;
        double r4045831 = a2;
        double r4045832 = r4045830 * r4045831;
        double r4045833 = b1;
        double r4045834 = b2;
        double r4045835 = r4045833 * r4045834;
        double r4045836 = r4045832 / r4045835;
        return r4045836;
}

double f(double a1, double a2, double b1, double b2) {
        double r4045837 = a1;
        double r4045838 = a2;
        double r4045839 = r4045837 * r4045838;
        double r4045840 = -3.023233587679621e+251;
        bool r4045841 = r4045839 <= r4045840;
        double r4045842 = b1;
        double r4045843 = r4045837 / r4045842;
        double r4045844 = b2;
        double r4045845 = r4045838 / r4045844;
        double r4045846 = r4045843 * r4045845;
        double r4045847 = -2.1296092868396195e-227;
        bool r4045848 = r4045839 <= r4045847;
        double r4045849 = 1.0;
        double r4045850 = r4045849 / r4045842;
        double r4045851 = r4045839 * r4045850;
        double r4045852 = r4045851 / r4045844;
        double r4045853 = 2.887172661957492e-160;
        bool r4045854 = r4045839 <= r4045853;
        double r4045855 = 2.1722925108220896e+142;
        bool r4045856 = r4045839 <= r4045855;
        double r4045857 = r4045838 / r4045842;
        double r4045858 = r4045837 * r4045857;
        double r4045859 = r4045858 / r4045844;
        double r4045860 = r4045856 ? r4045852 : r4045859;
        double r4045861 = r4045854 ? r4045846 : r4045860;
        double r4045862 = r4045848 ? r4045852 : r4045861;
        double r4045863 = r4045841 ? r4045846 : r4045862;
        return r4045863;
}

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

Original10.8
Target10.7
Herbie5.7
\[\frac{a1}{b1} \cdot \frac{a2}{b2}\]

Derivation

  1. Split input into 3 regimes
  2. if (* a1 a2) < -3.023233587679621e+251 or -2.1296092868396195e-227 < (* a1 a2) < 2.887172661957492e-160

    1. Initial program 17.9

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

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

    if -3.023233587679621e+251 < (* a1 a2) < -2.1296092868396195e-227 or 2.887172661957492e-160 < (* a1 a2) < 2.1722925108220896e+142

    1. Initial program 4.3

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

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

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

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

      \[\leadsto \frac{\color{blue}{a1} \cdot \frac{a2}{b1}}{b2}\]
    8. Using strategy rm
    9. Applied div-inv11.6

      \[\leadsto \frac{a1 \cdot \color{blue}{\left(a2 \cdot \frac{1}{b1}\right)}}{b2}\]
    10. Applied associate-*r*4.4

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

    if 2.1722925108220896e+142 < (* a1 a2)

    1. Initial program 26.0

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

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

      \[\leadsto \frac{\frac{a1 \cdot a2}{\color{blue}{1 \cdot b1}}}{b2}\]
    6. Applied times-frac15.9

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -3.023233587679621 \cdot 10^{+251}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -2.1296092868396195 \cdot 10^{-227}:\\ \;\;\;\;\frac{\left(a1 \cdot a2\right) \cdot \frac{1}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 2.887172661957492 \cdot 10^{-160}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 2.1722925108220896 \cdot 10^{+142}:\\ \;\;\;\;\frac{\left(a1 \cdot a2\right) \cdot \frac{1}{b1}}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1 \cdot \frac{a2}{b1}}{b2}\\ \end{array}\]

Reproduce

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

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

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