Average Error: 10.9 → 5.4
Time: 10.6s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;a2 \cdot a1 \le -1.2876487305313636 \cdot 10^{+181}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \mathbf{elif}\;a2 \cdot a1 \le -6.385030884325899 \cdot 10^{-218}:\\ \;\;\;\;\frac{a2 \cdot a1}{b1} \cdot \frac{1}{b2}\\ \mathbf{elif}\;a2 \cdot a1 \le 4.775209065579154 \cdot 10^{-193}:\\ \;\;\;\;\frac{a1}{\frac{b2}{\frac{a2}{b1}}}\\ \mathbf{elif}\;a2 \cdot a1 \le 1.1827835492321197 \cdot 10^{+164}:\\ \;\;\;\;\frac{a2 \cdot a1}{b1} \cdot \frac{1}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{\frac{b2}{\frac{a2}{b1}}}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;a2 \cdot a1 \le -1.2876487305313636 \cdot 10^{+181}:\\
\;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\

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

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

\mathbf{elif}\;a2 \cdot a1 \le 1.1827835492321197 \cdot 10^{+164}:\\
\;\;\;\;\frac{a2 \cdot a1}{b1} \cdot \frac{1}{b2}\\

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r5983460 = a1;
        double r5983461 = a2;
        double r5983462 = r5983460 * r5983461;
        double r5983463 = b1;
        double r5983464 = b2;
        double r5983465 = r5983463 * r5983464;
        double r5983466 = r5983462 / r5983465;
        return r5983466;
}

double f(double a1, double a2, double b1, double b2) {
        double r5983467 = a2;
        double r5983468 = a1;
        double r5983469 = r5983467 * r5983468;
        double r5983470 = -1.2876487305313636e+181;
        bool r5983471 = r5983469 <= r5983470;
        double r5983472 = b1;
        double r5983473 = r5983467 / r5983472;
        double r5983474 = b2;
        double r5983475 = r5983473 / r5983474;
        double r5983476 = r5983468 * r5983475;
        double r5983477 = -6.385030884325899e-218;
        bool r5983478 = r5983469 <= r5983477;
        double r5983479 = r5983469 / r5983472;
        double r5983480 = 1.0;
        double r5983481 = r5983480 / r5983474;
        double r5983482 = r5983479 * r5983481;
        double r5983483 = 4.775209065579154e-193;
        bool r5983484 = r5983469 <= r5983483;
        double r5983485 = r5983474 / r5983473;
        double r5983486 = r5983468 / r5983485;
        double r5983487 = 1.1827835492321197e+164;
        bool r5983488 = r5983469 <= r5983487;
        double r5983489 = r5983488 ? r5983482 : r5983486;
        double r5983490 = r5983484 ? r5983486 : r5983489;
        double r5983491 = r5983478 ? r5983482 : r5983490;
        double r5983492 = r5983471 ? r5983476 : r5983491;
        return r5983492;
}

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

Derivation

  1. Split input into 3 regimes
  2. if (* a1 a2) < -1.2876487305313636e+181

    1. Initial program 29.7

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

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

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

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

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

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

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

    if -1.2876487305313636e+181 < (* a1 a2) < -6.385030884325899e-218 or 4.775209065579154e-193 < (* a1 a2) < 1.1827835492321197e+164

    1. Initial program 4.1

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

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

      \[\leadsto \frac{\frac{a1 \cdot a2}{b1}}{\color{blue}{1 \cdot b2}}\]
    6. Applied associate-/r*4.2

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

      \[\leadsto \frac{\color{blue}{\frac{a1}{b1} \cdot a2}}{b2}\]
    8. Using strategy rm
    9. Applied associate-*l/4.2

      \[\leadsto \frac{\color{blue}{\frac{a1 \cdot a2}{b1}}}{b2}\]
    10. Using strategy rm
    11. Applied div-inv4.3

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

    if -6.385030884325899e-218 < (* a1 a2) < 4.775209065579154e-193 or 1.1827835492321197e+164 < (* a1 a2)

    1. Initial program 18.0

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

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

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;a2 \cdot a1 \le -1.2876487305313636 \cdot 10^{+181}:\\ \;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\ \mathbf{elif}\;a2 \cdot a1 \le -6.385030884325899 \cdot 10^{-218}:\\ \;\;\;\;\frac{a2 \cdot a1}{b1} \cdot \frac{1}{b2}\\ \mathbf{elif}\;a2 \cdot a1 \le 4.775209065579154 \cdot 10^{-193}:\\ \;\;\;\;\frac{a1}{\frac{b2}{\frac{a2}{b1}}}\\ \mathbf{elif}\;a2 \cdot a1 \le 1.1827835492321197 \cdot 10^{+164}:\\ \;\;\;\;\frac{a2 \cdot a1}{b1} \cdot \frac{1}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a1}{\frac{b2}{\frac{a2}{b1}}}\\ \end{array}\]

Reproduce

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

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

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