\frac{x + y}{1 - \frac{y}{z}}\begin{array}{l}
\mathbf{if}\;z \le -2.9656743812715667 \cdot 10^{-16} \lor \neg \left(z \le 7.8493791686123403 \cdot 10^{-10}\right):\\
\;\;\;\;\frac{1}{1 - \frac{y}{z}} \cdot \left(x + y\right)\\
\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 r575863 = x;
double r575864 = y;
double r575865 = r575863 + r575864;
double r575866 = 1.0;
double r575867 = z;
double r575868 = r575864 / r575867;
double r575869 = r575866 - r575868;
double r575870 = r575865 / r575869;
return r575870;
}
double f(double x, double y, double z) {
double r575871 = z;
double r575872 = -2.9656743812715667e-16;
bool r575873 = r575871 <= r575872;
double r575874 = 7.84937916861234e-10;
bool r575875 = r575871 <= r575874;
double r575876 = !r575875;
bool r575877 = r575873 || r575876;
double r575878 = 1.0;
double r575879 = 1.0;
double r575880 = y;
double r575881 = r575880 / r575871;
double r575882 = r575879 - r575881;
double r575883 = r575878 / r575882;
double r575884 = x;
double r575885 = r575884 + r575880;
double r575886 = r575883 * r575885;
double r575887 = r575879 / r575885;
double r575888 = r575885 * r575871;
double r575889 = r575880 / r575888;
double r575890 = r575887 - r575889;
double r575891 = r575878 / r575890;
double r575892 = r575877 ? r575886 : r575891;
return r575892;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 7.6 |
|---|---|
| Target | 4.0 |
| Herbie | 2.4 |
if z < -2.9656743812715667e-16 or 7.84937916861234e-10 < z Initial program 0.1
rmApplied clear-num0.2
rmApplied div-inv0.2
Applied add-cube-cbrt0.2
Applied times-frac0.2
Simplified0.2
Simplified0.1
if -2.9656743812715667e-16 < z < 7.84937916861234e-10Initial program 15.6
rmApplied clear-num15.7
rmApplied div-sub15.7
Simplified4.9
Final simplification2.4
herbie shell --seed 2020045
(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))))