\frac{a1 \cdot a2}{b1 \cdot b2}
\begin{array}{l}
\mathbf{if}\;a1 \cdot a2 \leq -3.4267994419717365 \cdot 10^{+205} \lor \neg \left(a1 \cdot a2 \leq -1.6104718543684284 \cdot 10^{-288}\right) \land a1 \cdot a2 \leq 5.851337924507556 \cdot 10^{-237}:\\
\;\;\;\;\frac{a1}{\frac{b1}{a2} \cdot b2}\\
\mathbf{else}:\\
\;\;\;\;\frac{\frac{a1 \cdot a2}{b1}}{b2}\\
\end{array}
(FPCore (a1 a2 b1 b2) :precision binary64 (/ (* a1 a2) (* b1 b2)))
(FPCore (a1 a2 b1 b2)
:precision binary64
(if (or (<= (* a1 a2) -3.4267994419717365e+205)
(and (not (<= (* a1 a2) -1.6104718543684284e-288))
(<= (* a1 a2) 5.851337924507556e-237)))
(/ a1 (* (/ b1 a2) b2))
(/ (/ (* a1 a2) b1) b2)))double code(double a1, double a2, double b1, double b2) {
return (a1 * a2) / (b1 * b2);
}
double code(double a1, double a2, double b1, double b2) {
double tmp;
if (((a1 * a2) <= -3.4267994419717365e+205) || (!((a1 * a2) <= -1.6104718543684284e-288) && ((a1 * a2) <= 5.851337924507556e-237))) {
tmp = a1 / ((b1 / a2) * b2);
} else {
tmp = ((a1 * a2) / b1) / b2;
}
return tmp;
}




Bits error versus a1




Bits error versus a2




Bits error versus b1




Bits error versus b2
Results
| Original | 9.2 |
|---|---|
| Target | 8.6 |
| Herbie | 5.3 |
if (*.f64 a1 a2) < -3.42679944197173654e205 or -1.61047185436842835e-288 < (*.f64 a1 a2) < 5.85133792450755605e-237Initial program 17.4
Applied associate-/l*_binary648.2
Simplified4.0
Applied associate-/r/_binary644.0
if -3.42679944197173654e205 < (*.f64 a1 a2) < -1.61047185436842835e-288 or 5.85133792450755605e-237 < (*.f64 a1 a2) Initial program 6.0
Applied associate-/r*_binary645.8
Simplified9.0
Applied *-un-lft-identity_binary649.0
Applied associate-*l*_binary649.0
Simplified5.8
Final simplification5.3
herbie shell --seed 2022068
(FPCore (a1 a2 b1 b2)
:name "Quotient of products"
:precision binary64
:herbie-target
(* (/ a1 b1) (/ a2 b2))
(/ (* a1 a2) (* b1 b2)))