Average Error: 11.3 → 5.1
Time: 12.8s
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 r120680 = a1;
        double r120681 = a2;
        double r120682 = r120680 * r120681;
        double r120683 = b1;
        double r120684 = b2;
        double r120685 = r120683 * r120684;
        double r120686 = r120682 / r120685;
        return r120686;
}

double f(double a1, double a2, double b1, double b2) {
        double r120687 = b1;
        double r120688 = b2;
        double r120689 = r120687 * r120688;
        double r120690 = -4.452289351512009e+155;
        bool r120691 = r120689 <= r120690;
        double r120692 = a1;
        double r120693 = r120692 / r120687;
        double r120694 = a2;
        double r120695 = r120693 * r120694;
        double r120696 = r120695 / r120688;
        double r120697 = -1.1277446059000626e-225;
        bool r120698 = r120689 <= r120697;
        double r120699 = r120692 * r120694;
        double r120700 = r120688 * r120687;
        double r120701 = r120699 / r120700;
        double r120702 = 1.5375695969934522e-155;
        bool r120703 = r120689 <= r120702;
        double r120704 = r120688 / r120694;
        double r120705 = r120693 / r120704;
        double r120706 = 2.3353390683562385e+283;
        bool r120707 = r120689 <= r120706;
        double r120708 = r120689 / r120694;
        double r120709 = r120692 / r120708;
        double r120710 = r120707 ? r120709 : r120696;
        double r120711 = r120703 ? r120705 : r120710;
        double r120712 = r120698 ? r120701 : r120711;
        double r120713 = r120691 ? r120696 : r120712;
        return r120713;
}

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 associate-*l/11.7

      \[\leadsto \color{blue}{\frac{a1 \cdot a2}{b1}} \cdot \frac{1}{b2}\]
    9. Applied frac-times4.0

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

      \[\leadsto \frac{\color{blue}{a1 \cdot a2}}{b1 \cdot b2}\]
    11. Simplified4.0

      \[\leadsto \frac{a1 \cdot a2}{\color{blue}{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)))