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}{1.128379167095512558560699289955664426088 \cdot e^{z} - x \cdot y}\\
\end{array}double f(double x, double y, double z) {
double r29520460 = x;
double r29520461 = y;
double r29520462 = 1.1283791670955126;
double r29520463 = z;
double r29520464 = exp(r29520463);
double r29520465 = r29520462 * r29520464;
double r29520466 = r29520460 * r29520461;
double r29520467 = r29520465 - r29520466;
double r29520468 = r29520461 / r29520467;
double r29520469 = r29520460 + r29520468;
return r29520469;
}
double f(double x, double y, double z) {
double r29520470 = z;
double r29520471 = exp(r29520470);
double r29520472 = 2.2891660016159315e-308;
bool r29520473 = r29520471 <= r29520472;
double r29520474 = x;
double r29520475 = 1.0;
double r29520476 = r29520475 / r29520474;
double r29520477 = r29520474 - r29520476;
double r29520478 = y;
double r29520479 = 1.1283791670955126;
double r29520480 = r29520479 * r29520471;
double r29520481 = r29520474 * r29520478;
double r29520482 = r29520480 - r29520481;
double r29520483 = r29520478 / r29520482;
double r29520484 = r29520474 + r29520483;
double r29520485 = r29520473 ? r29520477 : r29520484;
return r29520485;
}




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)))))