\frac{x}{y} \cdot \left(z - t\right) + t\begin{array}{l}
\mathbf{if}\;t \le -6.904120390825682619763527695919909441702 \cdot 10^{-275} \lor \neg \left(t \le 3.156622071944891387963639537805442137426 \cdot 10^{-195}\right):\\
\;\;\;\;\mathsf{fma}\left(\frac{x}{y}, z - t, t\right)\\
\mathbf{else}:\\
\;\;\;\;\left(\frac{x \cdot z}{y} - \frac{t \cdot x}{y}\right) + t\\
\end{array}double f(double x, double y, double z, double t) {
double r375842 = x;
double r375843 = y;
double r375844 = r375842 / r375843;
double r375845 = z;
double r375846 = t;
double r375847 = r375845 - r375846;
double r375848 = r375844 * r375847;
double r375849 = r375848 + r375846;
return r375849;
}
double f(double x, double y, double z, double t) {
double r375850 = t;
double r375851 = -6.904120390825683e-275;
bool r375852 = r375850 <= r375851;
double r375853 = 3.1566220719448914e-195;
bool r375854 = r375850 <= r375853;
double r375855 = !r375854;
bool r375856 = r375852 || r375855;
double r375857 = x;
double r375858 = y;
double r375859 = r375857 / r375858;
double r375860 = z;
double r375861 = r375860 - r375850;
double r375862 = fma(r375859, r375861, r375850);
double r375863 = r375857 * r375860;
double r375864 = r375863 / r375858;
double r375865 = r375850 * r375857;
double r375866 = r375865 / r375858;
double r375867 = r375864 - r375866;
double r375868 = r375867 + r375850;
double r375869 = r375856 ? r375862 : r375868;
return r375869;
}




Bits error versus x




Bits error versus y




Bits error versus z




Bits error versus t
| Original | 2.2 |
|---|---|
| Target | 2.3 |
| Herbie | 2.2 |
if t < -6.904120390825683e-275 or 3.1566220719448914e-195 < t Initial program 1.7
Simplified1.7
if -6.904120390825683e-275 < t < 3.1566220719448914e-195Initial program 5.7
Simplified5.7
rmApplied fma-udef5.7
Simplified5.7
Taylor expanded around 0 5.3
Final simplification2.2
herbie shell --seed 2019212 +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.7594565545626922e-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))