\frac{x \cdot \left(\left(y - z\right) + 1\right)}{z}\begin{array}{l}
\mathbf{if}\;x \le -1.126216460909622877236823923932130470222 \cdot 10^{-93} \lor \neg \left(x \le 2.965280437514699901782946893938156186351 \cdot 10^{-86}\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{x}{z}, y, \frac{x \cdot 1}{z} - x\right)\\
\mathbf{else}:\\
\;\;\;\;\left(x \cdot \left(1 + \left(y - z\right)\right)\right) \cdot \frac{1}{z}\\
\end{array}double f(double x, double y, double z) {
double r563692 = x;
double r563693 = y;
double r563694 = z;
double r563695 = r563693 - r563694;
double r563696 = 1.0;
double r563697 = r563695 + r563696;
double r563698 = r563692 * r563697;
double r563699 = r563698 / r563694;
return r563699;
}
double f(double x, double y, double z) {
double r563700 = x;
double r563701 = -1.1262164609096229e-93;
bool r563702 = r563700 <= r563701;
double r563703 = 2.9652804375147e-86;
bool r563704 = r563700 <= r563703;
double r563705 = !r563704;
bool r563706 = r563702 || r563705;
double r563707 = z;
double r563708 = r563700 / r563707;
double r563709 = y;
double r563710 = 1.0;
double r563711 = r563700 * r563710;
double r563712 = r563711 / r563707;
double r563713 = r563712 - r563700;
double r563714 = fma(r563708, r563709, r563713);
double r563715 = r563709 - r563707;
double r563716 = r563710 + r563715;
double r563717 = r563700 * r563716;
double r563718 = 1.0;
double r563719 = r563718 / r563707;
double r563720 = r563717 * r563719;
double r563721 = r563706 ? r563714 : r563720;
return r563721;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 9.9 |
|---|---|
| Target | 0.5 |
| Herbie | 0.2 |
if x < -1.1262164609096229e-93 or 2.9652804375147e-86 < x Initial program 17.5
Taylor expanded around 0 6.0
Simplified0.2
if -1.1262164609096229e-93 < x < 2.9652804375147e-86Initial program 0.2
rmApplied div-inv0.3
Final simplification0.2
herbie shell --seed 2019194 +o rules:numerics
(FPCore (x y z)
:name "Diagrams.TwoD.Segment.Bernstein:evaluateBernstein from diagrams-lib-1.3.0.3"
:herbie-target
(if (< x -2.71483106713436e-162) (- (* (+ 1.0 y) (/ x z)) x) (if (< x 3.874108816439546e-197) (* (* x (+ (- y z) 1.0)) (/ 1.0 z)) (- (* (+ 1.0 y) (/ x z)) x)))
(/ (* x (+ (- y z) 1.0)) z))