Average Error: 11.1 → 5.5
Time: 13.0s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -2.1038078135654004 \cdot 10^{+219}:\\ \;\;\;\;\frac{a1 \cdot \frac{a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -9.013586456865108 \cdot 10^{-95}:\\ \;\;\;\;\frac{1}{\frac{b2 \cdot b1}{a1 \cdot a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le -2.1062713645792236 \cdot 10^{-164}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 7.866668139775074 \cdot 10^{-256}:\\ \;\;\;\;\frac{a2}{b2} \cdot \frac{a1}{b1}\\ \mathbf{elif}\;a1 \cdot a2 \le 1.2752046247109955 \cdot 10^{+283}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a2}{b2} \cdot \frac{a1}{b1}\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;a1 \cdot a2 \le -2.1038078135654004 \cdot 10^{+219}:\\
\;\;\;\;\frac{a1 \cdot \frac{a2}{b1}}{b2}\\

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

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

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

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

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

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r5681690 = a1;
        double r5681691 = a2;
        double r5681692 = r5681690 * r5681691;
        double r5681693 = b1;
        double r5681694 = b2;
        double r5681695 = r5681693 * r5681694;
        double r5681696 = r5681692 / r5681695;
        return r5681696;
}

double f(double a1, double a2, double b1, double b2) {
        double r5681697 = a1;
        double r5681698 = a2;
        double r5681699 = r5681697 * r5681698;
        double r5681700 = -2.1038078135654004e+219;
        bool r5681701 = r5681699 <= r5681700;
        double r5681702 = b1;
        double r5681703 = r5681698 / r5681702;
        double r5681704 = r5681697 * r5681703;
        double r5681705 = b2;
        double r5681706 = r5681704 / r5681705;
        double r5681707 = -9.013586456865108e-95;
        bool r5681708 = r5681699 <= r5681707;
        double r5681709 = 1.0;
        double r5681710 = r5681705 * r5681702;
        double r5681711 = r5681710 / r5681699;
        double r5681712 = r5681709 / r5681711;
        double r5681713 = -2.1062713645792236e-164;
        bool r5681714 = r5681699 <= r5681713;
        double r5681715 = r5681699 / r5681702;
        double r5681716 = r5681715 / r5681705;
        double r5681717 = 7.866668139775074e-256;
        bool r5681718 = r5681699 <= r5681717;
        double r5681719 = r5681698 / r5681705;
        double r5681720 = r5681697 / r5681702;
        double r5681721 = r5681719 * r5681720;
        double r5681722 = 1.2752046247109955e+283;
        bool r5681723 = r5681699 <= r5681722;
        double r5681724 = r5681723 ? r5681716 : r5681721;
        double r5681725 = r5681718 ? r5681721 : r5681724;
        double r5681726 = r5681714 ? r5681716 : r5681725;
        double r5681727 = r5681708 ? r5681712 : r5681726;
        double r5681728 = r5681701 ? r5681706 : r5681727;
        return r5681728;
}

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

Derivation

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

    1. Initial program 36.9

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

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

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

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

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

    if -2.1038078135654004e+219 < (* a1 a2) < -9.013586456865108e-95

    1. Initial program 3.9

      \[\frac{a1 \cdot a2}{b1 \cdot b2}\]
    2. Using strategy rm
    3. Applied clear-num4.1

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

    if -9.013586456865108e-95 < (* a1 a2) < -2.1062713645792236e-164 or 7.866668139775074e-256 < (* a1 a2) < 1.2752046247109955e+283

    1. Initial program 5.4

      \[\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}}\]

    if -2.1062713645792236e-164 < (* a1 a2) < 7.866668139775074e-256 or 1.2752046247109955e+283 < (* a1 a2)

    1. Initial program 18.7

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;a1 \cdot a2 \le -2.1038078135654004 \cdot 10^{+219}:\\ \;\;\;\;\frac{a1 \cdot \frac{a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le -9.013586456865108 \cdot 10^{-95}:\\ \;\;\;\;\frac{1}{\frac{b2 \cdot b1}{a1 \cdot a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le -2.1062713645792236 \cdot 10^{-164}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{elif}\;a1 \cdot a2 \le 7.866668139775074 \cdot 10^{-256}:\\ \;\;\;\;\frac{a2}{b2} \cdot \frac{a1}{b1}\\ \mathbf{elif}\;a1 \cdot a2 \le 1.2752046247109955 \cdot 10^{+283}:\\ \;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\ \mathbf{else}:\\ \;\;\;\;\frac{a2}{b2} \cdot \frac{a1}{b1}\\ \end{array}\]

Reproduce

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

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

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