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 r403629 = x;
double r403630 = y;
double r403631 = r403630 - r403629;
double r403632 = z;
double r403633 = r403631 * r403632;
double r403634 = t;
double r403635 = r403633 / r403634;
double r403636 = r403629 + r403635;
return r403636;
}
double f(double x, double y, double z, double t) {
double r403637 = t;
double r403638 = -7.148917450038407e-67;
bool r403639 = r403637 <= r403638;
double r403640 = 3.2712300343252506e+39;
bool r403641 = r403637 <= r403640;
double r403642 = !r403641;
bool r403643 = r403639 || r403642;
double r403644 = y;
double r403645 = x;
double r403646 = r403644 - r403645;
double r403647 = r403646 / r403637;
double r403648 = z;
double r403649 = fma(r403647, r403648, r403645);
double r403650 = r403646 * r403648;
double r403651 = r403650 / r403637;
double r403652 = r403651 + r403645;
double r403653 = r403643 ? r403649 : r403652;
return r403653;
}




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)))