\frac{x}{y} \cdot \left(z - t\right) + t\begin{array}{l}
\mathbf{if}\;x \le 3.758228562227714 \cdot 10^{40} \lor \neg \left(x \le 2.3059419046843504 \cdot 10^{219}\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{x}{y}, z - t, t\right)\\
\mathbf{else}:\\
\;\;\;\;\frac{x}{\frac{y}{z - t}} + t\\
\end{array}double f(double x, double y, double z, double t) {
double r635409 = x;
double r635410 = y;
double r635411 = r635409 / r635410;
double r635412 = z;
double r635413 = t;
double r635414 = r635412 - r635413;
double r635415 = r635411 * r635414;
double r635416 = r635415 + r635413;
return r635416;
}
double f(double x, double y, double z, double t) {
double r635417 = x;
double r635418 = 3.758228562227714e+40;
bool r635419 = r635417 <= r635418;
double r635420 = 2.3059419046843504e+219;
bool r635421 = r635417 <= r635420;
double r635422 = !r635421;
bool r635423 = r635419 || r635422;
double r635424 = y;
double r635425 = r635417 / r635424;
double r635426 = z;
double r635427 = t;
double r635428 = r635426 - r635427;
double r635429 = fma(r635425, r635428, r635427);
double r635430 = r635424 / r635428;
double r635431 = r635417 / r635430;
double r635432 = r635431 + r635427;
double r635433 = r635423 ? r635429 : r635432;
return r635433;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 2.0 |
|---|---|
| Target | 2.3 |
| Herbie | 1.8 |
if x < 3.758228562227714e+40 or 2.3059419046843504e+219 < x Initial program 1.8
Simplified1.8
if 3.758228562227714e+40 < x < 2.3059419046843504e+219Initial program 3.4
Simplified3.4
rmApplied fma-udef3.4
Simplified1.5
Final simplification1.8
herbie shell --seed 2020042 +o rules:numerics
(FPCore (x y z t)
:name "Numeric.Signal.Multichannel:$cget from hsignal-0.2.7.1"
:precision binary64
:herbie-target
(if (< z 2.759456554562692e-282) (+ (* (/ x y) (- z t)) t) (if (< z 2.326994450874436e-110) (+ (* x (/ (- z t) y)) t) (+ (* (/ x y) (- z t)) t)))
(+ (* (/ x y) (- z t)) t))