Average Error: 11.4 → 3.1
Time: 12.6s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\ \;\;\;\;\frac{1}{b1} \cdot \frac{a1}{\frac{b2}{a2}}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -1.78460431200051311865071854770673924004 \cdot 10^{-282}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 0.0:\\ \;\;\;\;\frac{1}{b1} \cdot \frac{a1}{\frac{b2}{a2}}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 2.397032039407073387947567697695123600538 \cdot 10^{295}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b2}}{b1}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\
\;\;\;\;\frac{1}{b1} \cdot \frac{a1}{\frac{b2}{a2}}\\

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

\mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 0.0:\\
\;\;\;\;\frac{1}{b1} \cdot \frac{a1}{\frac{b2}{a2}}\\

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

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r12452054 = a1;
        double r12452055 = a2;
        double r12452056 = r12452054 * r12452055;
        double r12452057 = b1;
        double r12452058 = b2;
        double r12452059 = r12452057 * r12452058;
        double r12452060 = r12452056 / r12452059;
        return r12452060;
}

double f(double a1, double a2, double b1, double b2) {
        double r12452061 = a1;
        double r12452062 = a2;
        double r12452063 = r12452061 * r12452062;
        double r12452064 = b1;
        double r12452065 = b2;
        double r12452066 = r12452064 * r12452065;
        double r12452067 = r12452063 / r12452066;
        double r12452068 = -inf.0;
        bool r12452069 = r12452067 <= r12452068;
        double r12452070 = 1.0;
        double r12452071 = r12452070 / r12452064;
        double r12452072 = r12452065 / r12452062;
        double r12452073 = r12452061 / r12452072;
        double r12452074 = r12452071 * r12452073;
        double r12452075 = -1.784604312000513e-282;
        bool r12452076 = r12452067 <= r12452075;
        double r12452077 = 0.0;
        bool r12452078 = r12452067 <= r12452077;
        double r12452079 = 2.3970320394070734e+295;
        bool r12452080 = r12452067 <= r12452079;
        double r12452081 = r12452062 / r12452065;
        double r12452082 = r12452081 / r12452064;
        double r12452083 = r12452061 * r12452082;
        double r12452084 = r12452080 ? r12452067 : r12452083;
        double r12452085 = r12452078 ? r12452074 : r12452084;
        double r12452086 = r12452076 ? r12452067 : r12452085;
        double r12452087 = r12452069 ? r12452074 : r12452086;
        return r12452087;
}

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

Derivation

  1. Split input into 3 regimes
  2. if (/ (* a1 a2) (* b1 b2)) < -inf.0 or -1.784604312000513e-282 < (/ (* a1 a2) (* b1 b2)) < 0.0

    1. Initial program 18.2

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

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

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

      \[\leadsto \frac{a1}{\color{blue}{\frac{b1}{1} \cdot \frac{b2}{a2}}}\]
    7. Applied *-un-lft-identity5.5

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

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

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

    if -inf.0 < (/ (* a1 a2) (* b1 b2)) < -1.784604312000513e-282 or 0.0 < (/ (* a1 a2) (* b1 b2)) < 2.3970320394070734e+295

    1. Initial program 0.7

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]

    if 2.3970320394070734e+295 < (/ (* a1 a2) (* b1 b2))

    1. Initial program 61.5

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

      \[\leadsto \color{blue}{\frac{a1}{\frac{b1 \cdot b2}{a2}}}\]
    4. Taylor expanded around 0 46.3

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\ \;\;\;\;\frac{1}{b1} \cdot \frac{a1}{\frac{b2}{a2}}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -1.78460431200051311865071854770673924004 \cdot 10^{-282}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 0.0:\\ \;\;\;\;\frac{1}{b1} \cdot \frac{a1}{\frac{b2}{a2}}\\ \mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 2.397032039407073387947567697695123600538 \cdot 10^{295}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\ \mathbf{else}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b2}}{b1}\\ \end{array}\]

Reproduce

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

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

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