\frac{x + y}{1 - \frac{y}{z}}\begin{array}{l}
\mathbf{if}\;\frac{x + y}{1 - \frac{y}{z}} \le -6.3182486382086351 \cdot 10^{-275} \lor \neg \left(\frac{x + y}{1 - \frac{y}{z}} \le 0.0\right):\\
\;\;\;\;\frac{x + y}{1 - \frac{y}{z}}\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{\frac{1}{x + y} - \frac{y}{\left(x + y\right) \cdot z}}\\
\end{array}double f(double x, double y, double z) {
double r577968 = x;
double r577969 = y;
double r577970 = r577968 + r577969;
double r577971 = 1.0;
double r577972 = z;
double r577973 = r577969 / r577972;
double r577974 = r577971 - r577973;
double r577975 = r577970 / r577974;
return r577975;
}
double f(double x, double y, double z) {
double r577976 = x;
double r577977 = y;
double r577978 = r577976 + r577977;
double r577979 = 1.0;
double r577980 = z;
double r577981 = r577977 / r577980;
double r577982 = r577979 - r577981;
double r577983 = r577978 / r577982;
double r577984 = -6.318248638208635e-275;
bool r577985 = r577983 <= r577984;
double r577986 = 0.0;
bool r577987 = r577983 <= r577986;
double r577988 = !r577987;
bool r577989 = r577985 || r577988;
double r577990 = 1.0;
double r577991 = r577979 / r577978;
double r577992 = r577978 * r577980;
double r577993 = r577977 / r577992;
double r577994 = r577991 - r577993;
double r577995 = r577990 / r577994;
double r577996 = r577989 ? r577983 : r577995;
return r577996;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 7.5 |
|---|---|
| Target | 3.9 |
| Herbie | 0.3 |
if (/ (+ x y) (- 1.0 (/ y z))) < -6.318248638208635e-275 or 0.0 < (/ (+ x y) (- 1.0 (/ y z))) Initial program 0.1
if -6.318248638208635e-275 < (/ (+ x y) (- 1.0 (/ y z))) < 0.0Initial program 57.4
rmApplied clear-num57.5
rmApplied div-sub57.5
rmApplied div-inv57.5
Applied associate-/l*2.0
Simplified2.0
Final simplification0.3
herbie shell --seed 2020089 +o rules:numerics
(FPCore (x y z)
:name "Graphics.Rendering.Chart.Backend.Diagrams:calcFontMetrics from Chart-diagrams-1.5.1, A"
:precision binary64
:herbie-target
(if (< y -3.7429310762689856e+171) (* (/ (+ y x) (- y)) z) (if (< y 3.5534662456086734e+168) (/ (+ x y) (- 1 (/ y z))) (* (/ (+ y x) (- y)) z)))
(/ (+ x y) (- 1 (/ y z))))