x + \frac{y}{1.128379167095512558560699289955664426088 \cdot e^{z} - x \cdot y}\begin{array}{l}
\mathbf{if}\;e^{z} \le 2.289166001615931520939634610774789889377 \cdot 10^{-308}:\\
\;\;\;\;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 r19886153 = x;
double r19886154 = y;
double r19886155 = 1.1283791670955126;
double r19886156 = z;
double r19886157 = exp(r19886156);
double r19886158 = r19886155 * r19886157;
double r19886159 = r19886153 * r19886154;
double r19886160 = r19886158 - r19886159;
double r19886161 = r19886154 / r19886160;
double r19886162 = r19886153 + r19886161;
return r19886162;
}
double f(double x, double y, double z) {
double r19886163 = z;
double r19886164 = exp(r19886163);
double r19886165 = 2.2891660016159315e-308;
bool r19886166 = r19886164 <= r19886165;
double r19886167 = x;
double r19886168 = 1.0;
double r19886169 = r19886168 / r19886167;
double r19886170 = r19886167 - r19886169;
double r19886171 = y;
double r19886172 = 1.1283791670955126;
double r19886173 = r19886164 * r19886172;
double r19886174 = r19886167 * r19886171;
double r19886175 = r19886173 - r19886174;
double r19886176 = r19886171 / r19886175;
double r19886177 = r19886167 + r19886176;
double r19886178 = r19886166 ? r19886170 : r19886177;
return r19886178;
}




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) < 2.2891660016159315e-308Initial program 8.7
Taylor expanded around inf 0.0
if 2.2891660016159315e-308 < (exp z) Initial program 1.7
Final simplification1.3
herbie shell --seed 2019174
(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)))))