\frac{a1 \cdot a2}{b1 \cdot b2}\begin{array}{l}
\mathbf{if}\;a1 \cdot a2 \le -2.97251895095999178047329774749525954037 \cdot 10^{245}:\\
\;\;\;\;\frac{a1}{b1} \cdot \frac{a2}{b2}\\
\mathbf{elif}\;a1 \cdot a2 \le -2.538508659456969327282848851815247527073 \cdot 10^{-281} \lor \neg \left(a1 \cdot a2 \le 4.178012939374055441343683101567782411238 \cdot 10^{-287} \lor \neg \left(a1 \cdot a2 \le 3.859905230799150421067740794787184289132 \cdot 10^{236}\right)\right):\\
\;\;\;\;\frac{a1 \cdot a2}{\sqrt[3]{b1} \cdot \sqrt[3]{b1}} \cdot \frac{\frac{1}{\sqrt[3]{b1}}}{b2}\\
\mathbf{else}:\\
\;\;\;\;\frac{a1}{\sqrt[3]{b2} \cdot \sqrt[3]{b2}} \cdot \frac{a2}{b1 \cdot \sqrt[3]{b2}}\\
\end{array}double f(double a1, double a2, double b1, double b2) {
double r110920 = a1;
double r110921 = a2;
double r110922 = r110920 * r110921;
double r110923 = b1;
double r110924 = b2;
double r110925 = r110923 * r110924;
double r110926 = r110922 / r110925;
return r110926;
}
double f(double a1, double a2, double b1, double b2) {
double r110927 = a1;
double r110928 = a2;
double r110929 = r110927 * r110928;
double r110930 = -2.972518950959992e+245;
bool r110931 = r110929 <= r110930;
double r110932 = b1;
double r110933 = r110927 / r110932;
double r110934 = b2;
double r110935 = r110928 / r110934;
double r110936 = r110933 * r110935;
double r110937 = -2.5385086594569693e-281;
bool r110938 = r110929 <= r110937;
double r110939 = 4.1780129393740554e-287;
bool r110940 = r110929 <= r110939;
double r110941 = 3.8599052307991504e+236;
bool r110942 = r110929 <= r110941;
double r110943 = !r110942;
bool r110944 = r110940 || r110943;
double r110945 = !r110944;
bool r110946 = r110938 || r110945;
double r110947 = cbrt(r110932);
double r110948 = r110947 * r110947;
double r110949 = r110929 / r110948;
double r110950 = 1.0;
double r110951 = r110950 / r110947;
double r110952 = r110951 / r110934;
double r110953 = r110949 * r110952;
double r110954 = cbrt(r110934);
double r110955 = r110954 * r110954;
double r110956 = r110927 / r110955;
double r110957 = r110932 * r110954;
double r110958 = r110928 / r110957;
double r110959 = r110956 * r110958;
double r110960 = r110946 ? r110953 : r110959;
double r110961 = r110931 ? r110936 : r110960;
return r110961;
}




Bits error versus a1




Bits error versus a2




Bits error versus b1




Bits error versus b2
Results
| Original | 11.5 |
|---|---|
| Target | 11.5 |
| Herbie | 4.5 |
if (* a1 a2) < -2.972518950959992e+245Initial program 44.4
rmApplied times-frac10.0
if -2.972518950959992e+245 < (* a1 a2) < -2.5385086594569693e-281 or 4.1780129393740554e-287 < (* a1 a2) < 3.8599052307991504e+236Initial program 5.1
rmApplied clear-num5.4
rmApplied associate-/l*5.6
rmApplied div-inv5.7
Applied add-cube-cbrt6.3
Applied times-frac4.2
Applied add-cube-cbrt4.2
Applied times-frac4.3
Simplified4.1
Simplified4.0
if -2.5385086594569693e-281 < (* a1 a2) < 4.1780129393740554e-287 or 3.8599052307991504e+236 < (* a1 a2) Initial program 24.4
rmApplied clear-num24.4
rmApplied associate-/l*24.0
rmApplied div-inv24.0
Applied *-un-lft-identity24.0
Applied times-frac25.1
Applied associate-/r*25.0
Simplified24.4
rmApplied add-cube-cbrt24.5
Applied add-cube-cbrt24.5
Applied times-frac24.5
Applied *-un-lft-identity24.5
Applied times-frac24.5
Applied times-frac4.9
Simplified4.9
Simplified4.9
Final simplification4.5
herbie shell --seed 2019351 +o rules:numerics
(FPCore (a1 a2 b1 b2)
:name "Quotient of products"
:precision binary64
:herbie-target
(* (/ a1 b1) (/ a2 b2))
(/ (* a1 a2) (* b1 b2)))