x + \frac{y}{1.1283791670955126 \cdot e^{z} - x \cdot y}\begin{array}{l}
\mathbf{if}\;e^{z} \le 6.9432478850086 \cdot 10^{-310}:\\
\;\;\;\;x - \frac{1}{x}\\
\mathbf{else}:\\
\;\;\;\;x + \frac{y}{\sqrt{e^{z} \cdot 1.1283791670955126} \cdot \sqrt{e^{z} \cdot 1.1283791670955126} - x \cdot y}\\
\end{array}double f(double x, double y, double z) {
double r19164803 = x;
double r19164804 = y;
double r19164805 = 1.1283791670955126;
double r19164806 = z;
double r19164807 = exp(r19164806);
double r19164808 = r19164805 * r19164807;
double r19164809 = r19164803 * r19164804;
double r19164810 = r19164808 - r19164809;
double r19164811 = r19164804 / r19164810;
double r19164812 = r19164803 + r19164811;
return r19164812;
}
double f(double x, double y, double z) {
double r19164813 = z;
double r19164814 = exp(r19164813);
double r19164815 = 6.9432478850086e-310;
bool r19164816 = r19164814 <= r19164815;
double r19164817 = x;
double r19164818 = 1.0;
double r19164819 = r19164818 / r19164817;
double r19164820 = r19164817 - r19164819;
double r19164821 = y;
double r19164822 = 1.1283791670955126;
double r19164823 = r19164814 * r19164822;
double r19164824 = sqrt(r19164823);
double r19164825 = r19164824 * r19164824;
double r19164826 = r19164817 * r19164821;
double r19164827 = r19164825 - r19164826;
double r19164828 = r19164821 / r19164827;
double r19164829 = r19164817 + r19164828;
double r19164830 = r19164816 ? r19164820 : r19164829;
return r19164830;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 2.9 |
|---|---|
| Target | 0.0 |
| Herbie | 1.2 |
if (exp z) < 6.9432478850086e-310Initial program 7.1
Taylor expanded around inf 0.0
if 6.9432478850086e-310 < (exp z) Initial program 1.5
rmApplied add-sqr-sqrt1.7
Final simplification1.2
herbie shell --seed 2019165 +o rules:numerics
(FPCore (x y z)
:name "Numeric.SpecFunctions:invErfc from math-functions-0.1.5.2, A"
:herbie-target
(+ x (/ 1.0 (- (* (/ 1.1283791670955126 y) (exp z)) x)))
(+ x (/ y (- (* 1.1283791670955126 (exp z)) (* x y)))))