Average Error: 11.5 → 5.7
Time: 13.3s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -1.100721826907999911467992266722832772944 \cdot 10^{269}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -3.49050163230014819970050953927807740633 \cdot 10^{-197}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1} \cdot \frac{1}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 4.475784744408438094636863798469716860556 \cdot 10^{-83}:\\ \;\;\;\;\frac{a1}{\frac{b2}{\frac{a2}{b1}}}\\ \mathbf{elif}\;a1 \cdot a2 \le 6.099192957207017609535814106210005852322 \cdot 10^{243}:\\ \;\;\;\;\frac{a1 \cdot a2}{b2 \cdot b1}\\ \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 -1.100721826907999911467992266722832772944 \cdot 10^{269}:\\
\;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\

\mathbf{elif}\;a1 \cdot a2 \le -3.49050163230014819970050953927807740633 \cdot 10^{-197}:\\
\;\;\;\;\frac{a1 \cdot a2}{b1} \cdot \frac{1}{b2}\\

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

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

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r5654041 = a1;
        double r5654042 = a2;
        double r5654043 = r5654041 * r5654042;
        double r5654044 = b1;
        double r5654045 = b2;
        double r5654046 = r5654044 * r5654045;
        double r5654047 = r5654043 / r5654046;
        return r5654047;
}

double f(double a1, double a2, double b1, double b2) {
        double r5654048 = a1;
        double r5654049 = a2;
        double r5654050 = r5654048 * r5654049;
        double r5654051 = -1.1007218269079999e+269;
        bool r5654052 = r5654050 <= r5654051;
        double r5654053 = b1;
        double r5654054 = r5654048 / r5654053;
        double r5654055 = b2;
        double r5654056 = r5654049 / r5654055;
        double r5654057 = r5654054 * r5654056;
        double r5654058 = -3.490501632300148e-197;
        bool r5654059 = r5654050 <= r5654058;
        double r5654060 = r5654050 / r5654053;
        double r5654061 = 1.0;
        double r5654062 = r5654061 / r5654055;
        double r5654063 = r5654060 * r5654062;
        double r5654064 = 4.475784744408438e-83;
        bool r5654065 = r5654050 <= r5654064;
        double r5654066 = r5654049 / r5654053;
        double r5654067 = r5654055 / r5654066;
        double r5654068 = r5654048 / r5654067;
        double r5654069 = 6.0991929572070176e+243;
        bool r5654070 = r5654050 <= r5654069;
        double r5654071 = r5654055 * r5654053;
        double r5654072 = r5654050 / r5654071;
        double r5654073 = r5654070 ? r5654072 : r5654057;
        double r5654074 = r5654065 ? r5654068 : r5654073;
        double r5654075 = r5654059 ? r5654063 : r5654074;
        double r5654076 = r5654052 ? r5654057 : r5654075;
        return r5654076;
}

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

Derivation

  1. Split input into 4 regimes
  2. if (* a1 a2) < -1.1007218269079999e+269 or 6.0991929572070176e+243 < (* a1 a2)

    1. Initial program 46.1

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

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

    if -1.1007218269079999e+269 < (* a1 a2) < -3.490501632300148e-197

    1. Initial program 4.9

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

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

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

    if -3.490501632300148e-197 < (* a1 a2) < 4.475784744408438e-83

    1. Initial program 12.9

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

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

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

      \[\leadsto \frac{\color{blue}{\frac{a1}{1} \cdot \frac{a2}{b1}}}{b2}\]
    7. Applied associate-/l*6.0

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

    if 4.475784744408438e-83 < (* a1 a2) < 6.0991929572070176e+243

    1. Initial program 4.9

      \[\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 clear-num4.8

      \[\leadsto \frac{\color{blue}{\frac{1}{\frac{b1}{a1 \cdot a2}}}}{b2}\]
    6. Taylor expanded around 0 4.9

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -1.100721826907999911467992266722832772944 \cdot 10^{269}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -3.49050163230014819970050953927807740633 \cdot 10^{-197}:\\ \;\;\;\;\frac{a1 \cdot a2}{b1} \cdot \frac{1}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 4.475784744408438094636863798469716860556 \cdot 10^{-83}:\\ \;\;\;\;\frac{a1}{\frac{b2}{\frac{a2}{b1}}}\\ \mathbf{elif}\;a1 \cdot a2 \le 6.099192957207017609535814106210005852322 \cdot 10^{243}:\\ \;\;\;\;\frac{a1 \cdot a2}{b2 \cdot b1}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \end{array}\]

Reproduce

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

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

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