x + \frac{\left(y - x\right) \cdot z}{t}\begin{array}{l}
\mathbf{if}\;x \le -2.7932208206939209 \cdot 10^{-119} \lor \neg \left(x \le 1.849643447572145 \cdot 10^{-145}\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{z}{t}, y - x, x\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{z}{\frac{t}{y - x}} + x\\
\end{array}double f(double x, double y, double z, double t) {
double r444294 = x;
double r444295 = y;
double r444296 = r444295 - r444294;
double r444297 = z;
double r444298 = r444296 * r444297;
double r444299 = t;
double r444300 = r444298 / r444299;
double r444301 = r444294 + r444300;
return r444301;
}
double f(double x, double y, double z, double t) {
double r444302 = x;
double r444303 = -2.793220820693921e-119;
bool r444304 = r444302 <= r444303;
double r444305 = 1.849643447572145e-145;
bool r444306 = r444302 <= r444305;
double r444307 = !r444306;
bool r444308 = r444304 || r444307;
double r444309 = z;
double r444310 = t;
double r444311 = r444309 / r444310;
double r444312 = y;
double r444313 = r444312 - r444302;
double r444314 = fma(r444311, r444313, r444302);
double r444315 = r444310 / r444313;
double r444316 = r444309 / r444315;
double r444317 = r444316 + r444302;
double r444318 = r444308 ? r444314 : r444317;
return r444318;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 6.4 |
|---|---|
| Target | 2.1 |
| Herbie | 2.1 |
if x < -2.793220820693921e-119 or 1.849643447572145e-145 < x Initial program 6.8
Simplified7.6
rmApplied clear-num7.7
rmApplied fma-udef7.7
Simplified6.8
rmApplied associate-/r/0.7
Applied fma-def0.7
if -2.793220820693921e-119 < x < 1.849643447572145e-145Initial program 5.5
Simplified5.2
rmApplied clear-num5.5
rmApplied fma-udef5.5
Simplified5.1
Final simplification2.1
herbie shell --seed 2020036 +o rules:numerics
(FPCore (x y z t)
:name "Numeric.Histogram:binBounds from Chart-1.5.3"
:precision binary64
:herbie-target
(if (< x -9.025511195533005e-135) (- x (* (/ z t) (- x y))) (if (< x 4.275032163700715e-250) (+ x (* (/ (- y x) t) z)) (+ x (/ (- y x) (/ t z)))))
(+ x (/ (* (- y x) z) t)))