\frac{x + y}{1 - \frac{y}{z}}\begin{array}{l}
\mathbf{if}\;y \le -109013814756333918548664182814952914944 \lor \neg \left(y \le 537.7474182801523738817195408046245574951\right):\\
\;\;\;\;\frac{1}{\frac{1}{x + y} - \frac{\frac{y}{x + y}}{z}}\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{1 - \frac{y}{z}} \cdot \left(x + y\right)\\
\end{array}double f(double x, double y, double z) {
double r401725 = x;
double r401726 = y;
double r401727 = r401725 + r401726;
double r401728 = 1.0;
double r401729 = z;
double r401730 = r401726 / r401729;
double r401731 = r401728 - r401730;
double r401732 = r401727 / r401731;
return r401732;
}
double f(double x, double y, double z) {
double r401733 = y;
double r401734 = -1.0901381475633392e+38;
bool r401735 = r401733 <= r401734;
double r401736 = 537.7474182801524;
bool r401737 = r401733 <= r401736;
double r401738 = !r401737;
bool r401739 = r401735 || r401738;
double r401740 = 1.0;
double r401741 = 1.0;
double r401742 = x;
double r401743 = r401742 + r401733;
double r401744 = r401741 / r401743;
double r401745 = r401733 / r401743;
double r401746 = z;
double r401747 = r401745 / r401746;
double r401748 = r401744 - r401747;
double r401749 = r401740 / r401748;
double r401750 = r401733 / r401746;
double r401751 = r401741 - r401750;
double r401752 = r401740 / r401751;
double r401753 = r401752 * r401743;
double r401754 = r401739 ? r401749 : r401753;
return r401754;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 7.4 |
|---|---|
| Target | 4.0 |
| Herbie | 0.3 |
if y < -1.0901381475633392e+38 or 537.7474182801524 < y Initial program 15.4
Simplified15.4
rmApplied clear-num15.6
Simplified15.6
rmApplied div-sub15.6
Simplified15.6
Simplified9.5
rmApplied associate-/r*0.3
Simplified0.3
if -1.0901381475633392e+38 < y < 537.7474182801524Initial program 0.3
Simplified0.3
rmApplied div-inv0.3
Final simplification0.3
herbie shell --seed 2019179 +o rules:numerics
(FPCore (x y z)
:name "Graphics.Rendering.Chart.Backend.Diagrams:calcFontMetrics from Chart-diagrams-1.5.1, A"
:herbie-target
(if (< y -3.7429310762689856e+171) (* (/ (+ y x) (- y)) z) (if (< y 3.5534662456086734e+168) (/ (+ x y) (- 1.0 (/ y z))) (* (/ (+ y x) (- y)) z)))
(/ (+ x y) (- 1.0 (/ y z))))