x + \frac{\left(y - x\right) \cdot z}{t}\begin{array}{l}
\mathbf{if}\;t \le -7.148917450038407011215425202135074047193 \cdot 10^{-67} \lor \neg \left(t \le 3271230034325250553802375920643693608960\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{y - x}{t}, z, x\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{\left(y - x\right) \cdot z}{t} + x\\
\end{array}double f(double x, double y, double z, double t) {
double r371208 = x;
double r371209 = y;
double r371210 = r371209 - r371208;
double r371211 = z;
double r371212 = r371210 * r371211;
double r371213 = t;
double r371214 = r371212 / r371213;
double r371215 = r371208 + r371214;
return r371215;
}
double f(double x, double y, double z, double t) {
double r371216 = t;
double r371217 = -7.148917450038407e-67;
bool r371218 = r371216 <= r371217;
double r371219 = 3.2712300343252506e+39;
bool r371220 = r371216 <= r371219;
double r371221 = !r371220;
bool r371222 = r371218 || r371221;
double r371223 = y;
double r371224 = x;
double r371225 = r371223 - r371224;
double r371226 = r371225 / r371216;
double r371227 = z;
double r371228 = fma(r371226, r371227, r371224);
double r371229 = r371225 * r371227;
double r371230 = r371229 / r371216;
double r371231 = r371230 + r371224;
double r371232 = r371222 ? r371228 : r371231;
return r371232;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 7.0 |
|---|---|
| Target | 2.0 |
| Herbie | 1.7 |
if t < -7.148917450038407e-67 or 3.2712300343252506e+39 < t Initial program 9.9
Simplified1.4
if -7.148917450038407e-67 < t < 3.2712300343252506e+39Initial program 2.2
Simplified14.7
rmApplied *-un-lft-identity14.7
Applied add-cube-cbrt15.3
Applied times-frac15.3
Simplified15.3
rmApplied fma-udef15.3
Simplified2.2
Final simplification1.7
herbie shell --seed 2019303 +o rules:numerics
(FPCore (x y z t)
:name "Numeric.Histogram:binBounds from Chart-1.5.3"
:precision binary64
:herbie-target
(if (< x -9.0255111955330046e-135) (- x (* (/ z t) (- x y))) (if (< x 4.2750321637007147e-250) (+ x (* (/ (- y x) t) z)) (+ x (/ (- y x) (/ t z)))))
(+ x (/ (* (- y x) z) t)))