x + \frac{\left(y - x\right) \cdot z}{t}\begin{array}{l}
\mathbf{if}\;z \le -5.4093442608188232 \cdot 10^{-20}:\\
\;\;\;\;\mathsf{fma}\left(\frac{y - x}{t}, z, x\right)\\
\mathbf{elif}\;z \le -9.0264403633635939 \cdot 10^{-299}:\\
\;\;\;\;\left(\frac{z \cdot y}{t} - \frac{x \cdot z}{t}\right) + x\\
\mathbf{else}:\\
\;\;\;\;1 \cdot \mathsf{fma}\left(\frac{z}{t}, y - x, x\right)\\
\end{array}double f(double x, double y, double z, double t) {
double r2590 = x;
double r2591 = y;
double r2592 = r2591 - r2590;
double r2593 = z;
double r2594 = r2592 * r2593;
double r2595 = t;
double r2596 = r2594 / r2595;
double r2597 = r2590 + r2596;
return r2597;
}
double f(double x, double y, double z, double t) {
double r2598 = z;
double r2599 = -5.409344260818823e-20;
bool r2600 = r2598 <= r2599;
double r2601 = y;
double r2602 = x;
double r2603 = r2601 - r2602;
double r2604 = t;
double r2605 = r2603 / r2604;
double r2606 = fma(r2605, r2598, r2602);
double r2607 = -9.026440363363594e-299;
bool r2608 = r2598 <= r2607;
double r2609 = r2598 * r2601;
double r2610 = r2609 / r2604;
double r2611 = r2602 * r2598;
double r2612 = r2611 / r2604;
double r2613 = r2610 - r2612;
double r2614 = r2613 + r2602;
double r2615 = 1.0;
double r2616 = r2598 / r2604;
double r2617 = fma(r2616, r2603, r2602);
double r2618 = r2615 * r2617;
double r2619 = r2608 ? r2614 : r2618;
double r2620 = r2600 ? r2606 : r2619;
return r2620;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 6.5 |
|---|---|
| Target | 1.9 |
| Herbie | 1.6 |
if z < -5.409344260818823e-20Initial program 13.9
Simplified1.6
if -5.409344260818823e-20 < z < -9.026440363363594e-299Initial program 1.2
Simplified9.7
rmApplied clear-num9.7
rmApplied fma-udef9.7
Simplified8.8
Taylor expanded around 0 1.2
if -9.026440363363594e-299 < z Initial program 6.2
Simplified7.2
rmApplied clear-num7.4
rmApplied fma-udef7.4
Simplified6.7
rmApplied *-un-lft-identity6.7
Applied *-un-lft-identity6.7
Applied distribute-lft-out6.7
Simplified1.8
Final simplification1.6
herbie shell --seed 2020025 +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)))