\frac{x \cdot \left(y + z\right)}{z}\begin{array}{l}
\mathbf{if}\;y \le -441043790187128906842112 \lor \neg \left(y \le 3.330476111612473560474090169466101556088 \cdot 10^{-167}\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{x}{z}, y, x\right)\\
\mathbf{else}:\\
\;\;\;\;x \cdot \frac{y}{z} + x\\
\end{array}double f(double x, double y, double z) {
double r327552 = x;
double r327553 = y;
double r327554 = z;
double r327555 = r327553 + r327554;
double r327556 = r327552 * r327555;
double r327557 = r327556 / r327554;
return r327557;
}
double f(double x, double y, double z) {
double r327558 = y;
double r327559 = -4.410437901871289e+23;
bool r327560 = r327558 <= r327559;
double r327561 = 3.3304761116124736e-167;
bool r327562 = r327558 <= r327561;
double r327563 = !r327562;
bool r327564 = r327560 || r327563;
double r327565 = x;
double r327566 = z;
double r327567 = r327565 / r327566;
double r327568 = fma(r327567, r327558, r327565);
double r327569 = r327558 / r327566;
double r327570 = r327565 * r327569;
double r327571 = r327570 + r327565;
double r327572 = r327564 ? r327568 : r327571;
return r327572;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 12.5 |
|---|---|
| Target | 3.1 |
| Herbie | 2.2 |
if y < -4.410437901871289e+23 or 3.3304761116124736e-167 < y Initial program 12.0
Simplified3.8
if -4.410437901871289e+23 < y < 3.3304761116124736e-167Initial program 13.1
Simplified6.4
rmApplied fma-udef6.4
Simplified0.1
rmApplied div-inv0.1
Simplified0.1
Final simplification2.2
herbie shell --seed 2019174 +o rules:numerics
(FPCore (x y z)
:name "Numeric.SpecFunctions:choose from math-functions-0.1.5.2"
:herbie-target
(/ x (/ z (+ y z)))
(/ (* x (+ y z)) z))