\frac{x + y}{1 - \frac{y}{z}}\begin{array}{l}
\mathbf{if}\;y \le -560684022086480470999040 \lor \neg \left(y \le 5.796785265433715959339233680935876691365 \cdot 10^{-8}\right):\\
\;\;\;\;\frac{1}{\frac{1}{x + y} - \frac{\frac{y}{x + y}}{z}}\\
\mathbf{else}:\\
\;\;\;\;\frac{x + y}{1 - \frac{y}{z}}\\
\end{array}double f(double x, double y, double z) {
double r361605 = x;
double r361606 = y;
double r361607 = r361605 + r361606;
double r361608 = 1.0;
double r361609 = z;
double r361610 = r361606 / r361609;
double r361611 = r361608 - r361610;
double r361612 = r361607 / r361611;
return r361612;
}
double f(double x, double y, double z) {
double r361613 = y;
double r361614 = -5.606840220864805e+23;
bool r361615 = r361613 <= r361614;
double r361616 = 5.796785265433716e-08;
bool r361617 = r361613 <= r361616;
double r361618 = !r361617;
bool r361619 = r361615 || r361618;
double r361620 = 1.0;
double r361621 = 1.0;
double r361622 = x;
double r361623 = r361622 + r361613;
double r361624 = r361621 / r361623;
double r361625 = r361613 / r361623;
double r361626 = z;
double r361627 = r361625 / r361626;
double r361628 = r361624 - r361627;
double r361629 = r361620 / r361628;
double r361630 = r361613 / r361626;
double r361631 = r361621 - r361630;
double r361632 = r361623 / r361631;
double r361633 = r361619 ? r361629 : r361632;
return r361633;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 7.8 |
|---|---|
| Target | 4.1 |
| Herbie | 0.2 |
if y < -5.606840220864805e+23 or 5.796785265433716e-08 < y Initial program 15.5
rmApplied clear-num15.7
rmApplied div-sub15.7
Simplified15.7
Simplified9.7
rmApplied associate-/r*0.2
Simplified0.2
if -5.606840220864805e+23 < y < 5.796785265433716e-08Initial program 0.1
Final simplification0.2
herbie shell --seed 2019174 +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))))