Average Error: 11.2 → 5.3
Time: 2.0s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -3.18542674190811771 \cdot 10^{246}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b2}}{b1}\\ \mathbf{elif}\;a1 \cdot a2 \le -5.34505063860751228 \cdot 10^{-269}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 0.0:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 2.8073479006144804 \cdot 10^{206}:\\ \;\;\;\;\left(a1 \cdot a2\right) \cdot \frac{\frac{1}{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 -3.18542674190811771 \cdot 10^{246}:\\
\;\;\;\;a1 \cdot \frac{\frac{a2}{b2}}{b1}\\

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

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

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

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r156056 = a1;
        double r156057 = a2;
        double r156058 = r156056 * r156057;
        double r156059 = b1;
        double r156060 = b2;
        double r156061 = r156059 * r156060;
        double r156062 = r156058 / r156061;
        return r156062;
}

double f(double a1, double a2, double b1, double b2) {
        double r156063 = a1;
        double r156064 = a2;
        double r156065 = r156063 * r156064;
        double r156066 = -3.1854267419081177e+246;
        bool r156067 = r156065 <= r156066;
        double r156068 = b2;
        double r156069 = r156064 / r156068;
        double r156070 = b1;
        double r156071 = r156069 / r156070;
        double r156072 = r156063 * r156071;
        double r156073 = -5.345050638607512e-269;
        bool r156074 = r156065 <= r156073;
        double r156075 = r156065 / r156070;
        double r156076 = r156075 / r156068;
        double r156077 = 0.0;
        bool r156078 = r156065 <= r156077;
        double r156079 = r156063 / r156070;
        double r156080 = r156079 * r156069;
        double r156081 = 2.8073479006144804e+206;
        bool r156082 = r156065 <= r156081;
        double r156083 = 1.0;
        double r156084 = r156083 / r156070;
        double r156085 = r156084 / r156068;
        double r156086 = r156065 * r156085;
        double r156087 = r156082 ? r156086 : r156080;
        double r156088 = r156078 ? r156080 : r156087;
        double r156089 = r156074 ? r156076 : r156088;
        double r156090 = r156067 ? r156072 : r156089;
        return r156090;
}

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

Derivation

  1. Split input into 4 regimes
  2. if (* a1 a2) < -3.1854267419081177e+246

    1. Initial program 44.4

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

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

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

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

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

    if -3.1854267419081177e+246 < (* a1 a2) < -5.345050638607512e-269

    1. Initial program 5.0

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

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

    if -5.345050638607512e-269 < (* a1 a2) < 0.0 or 2.8073479006144804e+206 < (* a1 a2)

    1. Initial program 24.0

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

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

    if 0.0 < (* a1 a2) < 2.8073479006144804e+206

    1. Initial program 5.5

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
    2. Using strategy rm
    3. Applied div-inv5.8

      \[\leadsto \color{blue}{\left(a1 \cdot a2\right) \cdot \frac{1}{b1 \cdot b2}}\]
    4. Using strategy rm
    5. Applied associate-/r*5.6

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -3.18542674190811771 \cdot 10^{246}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b2}}{b1}\\ \mathbf{elif}\;a1 \cdot a2 \le -5.34505063860751228 \cdot 10^{-269}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 0.0:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 2.8073479006144804 \cdot 10^{206}:\\ \;\;\;\;\left(a1 \cdot a2\right) \cdot \frac{\frac{1}{b1}}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\ \end{array}\]

Reproduce

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

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

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