\frac{x + y}{1 - \frac{y}{z}}\begin{array}{l}
\mathbf{if}\;z \le -3.238072608215110164149777448017943406571 \cdot 10^{-21} \lor \neg \left(z \le 2.529936809907233979036830056799149601253 \cdot 10^{-78}\right):\\
\;\;\;\;\frac{y + x}{1 - \frac{y}{z}}\\
\mathbf{else}:\\
\;\;\;\;\frac{1}{\frac{1}{y + x} - \frac{y}{\left(y + x\right) \cdot z}}\\
\end{array}double f(double x, double y, double z) {
double r502528 = x;
double r502529 = y;
double r502530 = r502528 + r502529;
double r502531 = 1.0;
double r502532 = z;
double r502533 = r502529 / r502532;
double r502534 = r502531 - r502533;
double r502535 = r502530 / r502534;
return r502535;
}
double f(double x, double y, double z) {
double r502536 = z;
double r502537 = -3.23807260821511e-21;
bool r502538 = r502536 <= r502537;
double r502539 = 2.529936809907234e-78;
bool r502540 = r502536 <= r502539;
double r502541 = !r502540;
bool r502542 = r502538 || r502541;
double r502543 = y;
double r502544 = x;
double r502545 = r502543 + r502544;
double r502546 = 1.0;
double r502547 = r502543 / r502536;
double r502548 = r502546 - r502547;
double r502549 = r502545 / r502548;
double r502550 = 1.0;
double r502551 = r502546 / r502545;
double r502552 = r502545 * r502536;
double r502553 = r502543 / r502552;
double r502554 = r502551 - r502553;
double r502555 = r502550 / r502554;
double r502556 = r502542 ? r502549 : r502555;
return r502556;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 7.4 |
|---|---|
| Target | 4.2 |
| Herbie | 2.7 |
if z < -3.23807260821511e-21 or 2.529936809907234e-78 < z Initial program 0.6
Simplified0.6
if -3.23807260821511e-21 < z < 2.529936809907234e-78Initial program 17.0
Simplified17.0
rmApplied clear-num17.1
Simplified17.1
rmApplied div-sub17.1
Simplified17.1
Simplified5.7
Final simplification2.7
herbie shell --seed 2019196 +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))))