Average Error: 11.1 → 5.5
Time: 12.9s
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 r6075466 = a1;
        double r6075467 = a2;
        double r6075468 = r6075466 * r6075467;
        double r6075469 = b1;
        double r6075470 = b2;
        double r6075471 = r6075469 * r6075470;
        double r6075472 = r6075468 / r6075471;
        return r6075472;
}

double f(double a1, double a2, double b1, double b2) {
        double r6075473 = a1;
        double r6075474 = a2;
        double r6075475 = r6075473 * r6075474;
        double r6075476 = -2.1038078135654004e+219;
        bool r6075477 = r6075475 <= r6075476;
        double r6075478 = b1;
        double r6075479 = r6075474 / r6075478;
        double r6075480 = r6075473 * r6075479;
        double r6075481 = b2;
        double r6075482 = r6075480 / r6075481;
        double r6075483 = -9.013586456865108e-95;
        bool r6075484 = r6075475 <= r6075483;
        double r6075485 = 1.0;
        double r6075486 = r6075481 * r6075478;
        double r6075487 = r6075486 / r6075475;
        double r6075488 = r6075485 / r6075487;
        double r6075489 = -2.1062713645792236e-164;
        bool r6075490 = r6075475 <= r6075489;
        double r6075491 = r6075475 / r6075478;
        double r6075492 = r6075491 / r6075481;
        double r6075493 = 7.866668139775074e-256;
        bool r6075494 = r6075475 <= r6075493;
        double r6075495 = r6075474 / r6075481;
        double r6075496 = r6075473 / r6075478;
        double r6075497 = r6075495 * r6075496;
        double r6075498 = 1.2752046247109955e+283;
        bool r6075499 = r6075475 <= r6075498;
        double r6075500 = r6075499 ? r6075492 : r6075497;
        double r6075501 = r6075494 ? r6075497 : r6075500;
        double r6075502 = r6075490 ? r6075492 : r6075501;
        double r6075503 = r6075484 ? r6075488 : r6075502;
        double r6075504 = r6075477 ? r6075482 : r6075503;
        return r6075504;
}

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)))