double f(double a1, double a2, double b1, double b2) {
double r31200296 = a1;
double r31200297 = a2;
double r31200298 = r31200296 * r31200297;
double r31200299 = b1;
double r31200300 = b2;
double r31200301 = r31200299 * r31200300;
double r31200302 = r31200298 / r31200301;
return r31200302;
}
double f(double a1, double a2, double b1, double b2) {
double r31200303 = a1;
double r31200304 = a2;
double r31200305 = r31200303 * r31200304;
double r31200306 = b1;
double r31200307 = b2;
double r31200308 = r31200306 * r31200307;
double r31200309 = r31200305 / r31200308;
double r31200310 = -inf.0;
bool r31200311 = r31200309 <= r31200310;
double r31200312 = 1.0;
double r31200313 = r31200306 / r31200303;
double r31200314 = r31200312 / r31200313;
double r31200315 = r31200307 / r31200304;
double r31200316 = r31200314 / r31200315;
double r31200317 = -1.467391042233376e-284;
bool r31200318 = r31200309 <= r31200317;
double r31200319 = -0.0;
bool r31200320 = r31200309 <= r31200319;
double r31200321 = r31200304 / r31200306;
double r31200322 = r31200321 / r31200307;
double r31200323 = r31200303 * r31200322;
double r31200324 = 3.9728063804597205e+288;
bool r31200325 = r31200309 <= r31200324;
double r31200326 = r31200325 ? r31200309 : r31200323;
double r31200327 = r31200320 ? r31200323 : r31200326;
double r31200328 = r31200318 ? r31200309 : r31200327;
double r31200329 = r31200311 ? r31200316 : r31200328;
return r31200329;
}
\frac{a1 \cdot a2}{b1 \cdot b2}\begin{array}{l}
\mathbf{if}\;\frac{a1 \cdot a2}{b1 \cdot b2} = -\infty:\\
\;\;\;\;\frac{\frac{1}{\frac{b1}{a1}}}{\frac{b2}{a2}}\\
\mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -1.467391042233376 \cdot 10^{-284}:\\
\;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\
\mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le -0.0:\\
\;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\
\mathbf{elif}\;\frac{a1 \cdot a2}{b1 \cdot b2} \le 3.9728063804597205 \cdot 10^{+288}:\\
\;\;\;\;\frac{a1 \cdot a2}{b1 \cdot b2}\\
\mathbf{else}:\\
\;\;\;\;a1 \cdot \frac{\frac{a2}{b1}}{b2}\\
\end{array}



Bits error versus a1




Bits error versus a2




Bits error versus b1




Bits error versus b2
| Original | 11.3 |
|---|---|
| Target | 10.7 |
| Herbie | 3.2 |
if (/ (* a1 a2) (* b1 b2)) < -inf.0Initial program 60.0
rmApplied clear-num60.0
rmApplied times-frac8.8
Applied associate-/r*9.3
if -inf.0 < (/ (* a1 a2) (* b1 b2)) < -1.467391042233376e-284 or -0.0 < (/ (* a1 a2) (* b1 b2)) < 3.9728063804597205e+288Initial program 0.8
if -1.467391042233376e-284 < (/ (* a1 a2) (* b1 b2)) < -0.0 or 3.9728063804597205e+288 < (/ (* a1 a2) (* b1 b2)) Initial program 22.4
rmApplied clear-num22.5
rmApplied associate-/r*15.4
rmApplied *-un-lft-identity15.4
Applied add-sqr-sqrt15.4
Applied times-frac15.4
Simplified15.4
Simplified6.1
Final simplification3.2
herbie shell --seed 2019101 +o rules:numerics
(FPCore (a1 a2 b1 b2)
:name "Quotient of products"
:herbie-target
(* (/ a1 b1) (/ a2 b2))
(/ (* a1 a2) (* b1 b2)))