Average Error: 11.3 → 5.1
Time: 12.6s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;b1 \cdot b2 \le -4.452289351512009238820999151564290328377 \cdot 10^{155}:\\ \;\;\;\;\frac{\frac{a1}{b1} \cdot a2}{b2}\\ \mathbf{elif}\;b1 \cdot b2 \le -1.127744605900062648278972986449983094423 \cdot 10^{-225}:\\ \;\;\;\;\frac{a1 \cdot a2}{b2 \cdot b1}\\ \mathbf{elif}\;b1 \cdot b2 \le 1.537569596993452221139681688403437084805 \cdot 10^{-155}:\\ \;\;\;\;\frac{\frac{a1}{b1}}{\frac{b2}{a2}}\\ \mathbf{elif}\;b1 \cdot b2 \le 2.335339068356238477311146561514236710862 \cdot 10^{283}:\\ \;\;\;\;\frac{a1}{\frac{b1 \cdot b2}{a2}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{a1}{b1} \cdot a2}{b2}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;b1 \cdot b2 \le -4.452289351512009238820999151564290328377 \cdot 10^{155}:\\
\;\;\;\;\frac{\frac{a1}{b1} \cdot a2}{b2}\\

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

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

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

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r125576 = a1;
        double r125577 = a2;
        double r125578 = r125576 * r125577;
        double r125579 = b1;
        double r125580 = b2;
        double r125581 = r125579 * r125580;
        double r125582 = r125578 / r125581;
        return r125582;
}

double f(double a1, double a2, double b1, double b2) {
        double r125583 = b1;
        double r125584 = b2;
        double r125585 = r125583 * r125584;
        double r125586 = -4.452289351512009e+155;
        bool r125587 = r125585 <= r125586;
        double r125588 = a1;
        double r125589 = r125588 / r125583;
        double r125590 = a2;
        double r125591 = r125589 * r125590;
        double r125592 = r125591 / r125584;
        double r125593 = -1.1277446059000626e-225;
        bool r125594 = r125585 <= r125593;
        double r125595 = r125588 * r125590;
        double r125596 = r125584 * r125583;
        double r125597 = r125595 / r125596;
        double r125598 = 1.5375695969934522e-155;
        bool r125599 = r125585 <= r125598;
        double r125600 = r125584 / r125590;
        double r125601 = r125589 / r125600;
        double r125602 = 2.3353390683562385e+283;
        bool r125603 = r125585 <= r125602;
        double r125604 = r125585 / r125590;
        double r125605 = r125588 / r125604;
        double r125606 = r125603 ? r125605 : r125592;
        double r125607 = r125599 ? r125601 : r125606;
        double r125608 = r125594 ? r125597 : r125607;
        double r125609 = r125587 ? r125592 : r125608;
        return r125609;
}

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

Derivation

  1. Split input into 4 regimes
  2. if (* b1 b2) < -4.452289351512009e+155 or 2.3353390683562385e+283 < (* b1 b2)

    1. Initial program 16.7

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

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

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

      \[\leadsto \color{blue}{\left(\frac{a1}{b1} \cdot a2\right) \cdot \frac{1}{b2}}\]
    7. Using strategy rm
    8. Applied un-div-inv4.5

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

    if -4.452289351512009e+155 < (* b1 b2) < -1.1277446059000626e-225

    1. Initial program 4.0

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

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

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

      \[\leadsto \color{blue}{\left(\frac{a1}{b1} \cdot a2\right) \cdot \frac{1}{b2}}\]
    7. Using strategy rm
    8. Applied un-div-inv15.6

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

      \[\leadsto \frac{\color{blue}{\frac{a1 \cdot a2}{b1}}}{b2}\]
    11. Applied associate-/l/4.0

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

    if -1.1277446059000626e-225 < (* b1 b2) < 1.5375695969934522e-155

    1. Initial program 30.2

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

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

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

      \[\leadsto \color{blue}{\left(\frac{a1}{b1} \cdot a2\right) \cdot \frac{1}{b2}}\]
    7. Using strategy rm
    8. Applied un-div-inv10.0

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

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

    if 1.5375695969934522e-155 < (* b1 b2) < 2.3353390683562385e+283

    1. Initial program 4.6

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;b1 \cdot b2 \le -4.452289351512009238820999151564290328377 \cdot 10^{155}:\\ \;\;\;\;\frac{\frac{a1}{b1} \cdot a2}{b2}\\ \mathbf{elif}\;b1 \cdot b2 \le -1.127744605900062648278972986449983094423 \cdot 10^{-225}:\\ \;\;\;\;\frac{a1 \cdot a2}{b2 \cdot b1}\\ \mathbf{elif}\;b1 \cdot b2 \le 1.537569596993452221139681688403437084805 \cdot 10^{-155}:\\ \;\;\;\;\frac{\frac{a1}{b1}}{\frac{b2}{a2}}\\ \mathbf{elif}\;b1 \cdot b2 \le 2.335339068356238477311146561514236710862 \cdot 10^{283}:\\ \;\;\;\;\frac{a1}{\frac{b1 \cdot b2}{a2}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{a1}{b1} \cdot a2}{b2}\\ \end{array}\]

Reproduce

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

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

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