Average Error: 10.8 → 5.9
Time: 7.4s
Precision: 64
\[\frac{a1 \cdot a2}{b1 \cdot b2}\]
\[\begin{array}{l} \mathbf{if}\;a1 \cdot a2 = -\infty:\\ \;\;\;\;\frac{\frac{a1}{b2}}{b1} \cdot a2\\ \mathbf{elif}\;a1 \cdot a2 \le -3.239188966439507092571720652735298944769 \cdot 10^{-112}:\\ \;\;\;\;\frac{1}{b1 \cdot b2} \cdot \left(a1 \cdot a2\right)\\ \mathbf{elif}\;a1 \cdot a2 \le -1.818985289795094297976180574800361145199 \cdot 10^{-216}:\\ \;\;\;\;\frac{1}{b1} \cdot \frac{a1}{\frac{b2}{a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le -1.008422558588387463522628361222361000871 \cdot 10^{-262}:\\ \;\;\;\;\frac{1}{\frac{b1 \cdot b2}{a1 \cdot a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le 7.84171448107782709423190512508333836091 \cdot 10^{-206}:\\ \;\;\;\;\frac{a1}{b1 \cdot \frac{b2}{a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le 4.719850018748400047965767698303354255313 \cdot 10^{-39}:\\ \;\;\;\;\frac{1}{\frac{b1 \cdot b2}{a1 \cdot a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le 2.755921950293857730592587778295672190212 \cdot 10^{-31} \lor \neg \left(a1 \cdot a2 \le 3.42493188796159484839257753426458995292 \cdot 10^{160}\right):\\ \;\;\;\;\frac{\frac{a1}{b2}}{b1} \cdot a2\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{b1 \cdot b2} \cdot \left(a1 \cdot a2\right)\\ \end{array}\]
\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;a1 \cdot a2 = -\infty:\\
\;\;\;\;\frac{\frac{a1}{b2}}{b1} \cdot a2\\

\mathbf{elif}\;a1 \cdot a2 \le -3.239188966439507092571720652735298944769 \cdot 10^{-112}:\\
\;\;\;\;\frac{1}{b1 \cdot b2} \cdot \left(a1 \cdot a2\right)\\

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

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

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

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

\mathbf{elif}\;a1 \cdot a2 \le 2.755921950293857730592587778295672190212 \cdot 10^{-31} \lor \neg \left(a1 \cdot a2 \le 3.42493188796159484839257753426458995292 \cdot 10^{160}\right):\\
\;\;\;\;\frac{\frac{a1}{b2}}{b1} \cdot a2\\

\mathbf{else}:\\
\;\;\;\;\frac{1}{b1 \cdot b2} \cdot \left(a1 \cdot a2\right)\\

\end{array}
double f(double a1, double a2, double b1, double b2) {
        double r88980 = a1;
        double r88981 = a2;
        double r88982 = r88980 * r88981;
        double r88983 = b1;
        double r88984 = b2;
        double r88985 = r88983 * r88984;
        double r88986 = r88982 / r88985;
        return r88986;
}

double f(double a1, double a2, double b1, double b2) {
        double r88987 = a1;
        double r88988 = a2;
        double r88989 = r88987 * r88988;
        double r88990 = -inf.0;
        bool r88991 = r88989 <= r88990;
        double r88992 = b2;
        double r88993 = r88987 / r88992;
        double r88994 = b1;
        double r88995 = r88993 / r88994;
        double r88996 = r88995 * r88988;
        double r88997 = -3.239188966439507e-112;
        bool r88998 = r88989 <= r88997;
        double r88999 = 1.0;
        double r89000 = r88994 * r88992;
        double r89001 = r88999 / r89000;
        double r89002 = r89001 * r88989;
        double r89003 = -1.8189852897950943e-216;
        bool r89004 = r88989 <= r89003;
        double r89005 = r88999 / r88994;
        double r89006 = r88992 / r88988;
        double r89007 = r88987 / r89006;
        double r89008 = r89005 * r89007;
        double r89009 = -1.0084225585883875e-262;
        bool r89010 = r88989 <= r89009;
        double r89011 = r89000 / r88989;
        double r89012 = r88999 / r89011;
        double r89013 = 7.841714481077827e-206;
        bool r89014 = r88989 <= r89013;
        double r89015 = r88994 * r89006;
        double r89016 = r88987 / r89015;
        double r89017 = 4.7198500187484e-39;
        bool r89018 = r88989 <= r89017;
        double r89019 = 2.7559219502938577e-31;
        bool r89020 = r88989 <= r89019;
        double r89021 = 3.424931887961595e+160;
        bool r89022 = r88989 <= r89021;
        double r89023 = !r89022;
        bool r89024 = r89020 || r89023;
        double r89025 = r89024 ? r88996 : r89002;
        double r89026 = r89018 ? r89012 : r89025;
        double r89027 = r89014 ? r89016 : r89026;
        double r89028 = r89010 ? r89012 : r89027;
        double r89029 = r89004 ? r89008 : r89028;
        double r89030 = r88998 ? r89002 : r89029;
        double r89031 = r88991 ? r88996 : r89030;
        return r89031;
}

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

Derivation

  1. Split input into 5 regimes
  2. if (* a1 a2) < -inf.0 or 4.7198500187484e-39 < (* a1 a2) < 2.7559219502938577e-31 or 3.424931887961595e+160 < (* a1 a2)

    1. Initial program 33.7

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

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

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

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

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

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

      \[\leadsto \color{blue}{\frac{1}{b1}} \cdot \frac{a1}{\frac{b2}{a2}}\]
    10. Using strategy rm
    11. Applied associate-/r/17.9

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

      \[\leadsto \color{blue}{\left(\frac{1}{b1} \cdot \frac{a1}{b2}\right) \cdot a2}\]
    13. Simplified12.6

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

    if -inf.0 < (* a1 a2) < -3.239188966439507e-112 or 2.7559219502938577e-31 < (* a1 a2) < 3.424931887961595e+160

    1. Initial program 4.2

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

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

      \[\leadsto \frac{a1}{\color{blue}{\left(b1 \cdot b2\right) \cdot \frac{1}{a2}}}\]
    6. Applied *-un-lft-identity11.9

      \[\leadsto \frac{\color{blue}{1 \cdot a1}}{\left(b1 \cdot b2\right) \cdot \frac{1}{a2}}\]
    7. Applied times-frac4.5

      \[\leadsto \color{blue}{\frac{1}{b1 \cdot b2} \cdot \frac{a1}{\frac{1}{a2}}}\]
    8. Simplified4.4

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

    if -3.239188966439507e-112 < (* a1 a2) < -1.8189852897950943e-216

    1. Initial program 5.9

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

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

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

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

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

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

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

    if -1.8189852897950943e-216 < (* a1 a2) < -1.0084225585883875e-262 or 7.841714481077827e-206 < (* a1 a2) < 4.7198500187484e-39

    1. Initial program 6.3

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

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

    if -1.0084225585883875e-262 < (* a1 a2) < 7.841714481077827e-206

    1. Initial program 15.4

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

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

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;a1 \cdot a2 = -\infty:\\ \;\;\;\;\frac{\frac{a1}{b2}}{b1} \cdot a2\\ \mathbf{elif}\;a1 \cdot a2 \le -3.239188966439507092571720652735298944769 \cdot 10^{-112}:\\ \;\;\;\;\frac{1}{b1 \cdot b2} \cdot \left(a1 \cdot a2\right)\\ \mathbf{elif}\;a1 \cdot a2 \le -1.818985289795094297976180574800361145199 \cdot 10^{-216}:\\ \;\;\;\;\frac{1}{b1} \cdot \frac{a1}{\frac{b2}{a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le -1.008422558588387463522628361222361000871 \cdot 10^{-262}:\\ \;\;\;\;\frac{1}{\frac{b1 \cdot b2}{a1 \cdot a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le 7.84171448107782709423190512508333836091 \cdot 10^{-206}:\\ \;\;\;\;\frac{a1}{b1 \cdot \frac{b2}{a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le 4.719850018748400047965767698303354255313 \cdot 10^{-39}:\\ \;\;\;\;\frac{1}{\frac{b1 \cdot b2}{a1 \cdot a2}}\\ \mathbf{elif}\;a1 \cdot a2 \le 2.755921950293857730592587778295672190212 \cdot 10^{-31} \lor \neg \left(a1 \cdot a2 \le 3.42493188796159484839257753426458995292 \cdot 10^{160}\right):\\ \;\;\;\;\frac{\frac{a1}{b2}}{b1} \cdot a2\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{b1 \cdot b2} \cdot \left(a1 \cdot a2\right)\\ \end{array}\]

Reproduce

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

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

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