x + \frac{y}{1.128379167095512558560699289955664426088 \cdot e^{z} - x \cdot y}\begin{array}{l}
\mathbf{if}\;e^{z} \le 0.0:\\
\;\;\;\;x - \frac{1}{x}\\
\mathbf{else}:\\
\;\;\;\;x + \frac{y}{e^{z} \cdot 1.128379167095512558560699289955664426088 - x \cdot y}\\
\end{array}double f(double x, double y, double z) {
double r294994 = x;
double r294995 = y;
double r294996 = 1.1283791670955126;
double r294997 = z;
double r294998 = exp(r294997);
double r294999 = r294996 * r294998;
double r295000 = r294994 * r294995;
double r295001 = r294999 - r295000;
double r295002 = r294995 / r295001;
double r295003 = r294994 + r295002;
return r295003;
}
double f(double x, double y, double z) {
double r295004 = z;
double r295005 = exp(r295004);
double r295006 = 0.0;
bool r295007 = r295005 <= r295006;
double r295008 = x;
double r295009 = 1.0;
double r295010 = r295009 / r295008;
double r295011 = r295008 - r295010;
double r295012 = y;
double r295013 = 1.1283791670955126;
double r295014 = r295005 * r295013;
double r295015 = r295008 * r295012;
double r295016 = r295014 - r295015;
double r295017 = r295012 / r295016;
double r295018 = r295008 + r295017;
double r295019 = r295007 ? r295011 : r295018;
return r295019;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 3.4 |
|---|---|
| Target | 0.1 |
| Herbie | 1.3 |
if (exp z) < 0.0Initial program 8.7
Taylor expanded around inf 0.0
if 0.0 < (exp z) Initial program 1.7
Final simplification1.3
herbie shell --seed 2019174 +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)))))