x + \frac{y}{1.12837916709551256 \cdot e^{z} - x \cdot y}\begin{array}{l}
\mathbf{if}\;e^{z} \le 0.999576377249071224:\\
\;\;\;\;x - \frac{1}{x}\\
\mathbf{else}:\\
\;\;\;\;x + y \cdot \frac{1}{1.12837916709551256 \cdot e^{z} - x \cdot y}\\
\end{array}double f(double x, double y, double z) {
double r605258 = x;
double r605259 = y;
double r605260 = 1.1283791670955126;
double r605261 = z;
double r605262 = exp(r605261);
double r605263 = r605260 * r605262;
double r605264 = r605258 * r605259;
double r605265 = r605263 - r605264;
double r605266 = r605259 / r605265;
double r605267 = r605258 + r605266;
return r605267;
}
double f(double x, double y, double z) {
double r605268 = z;
double r605269 = exp(r605268);
double r605270 = 0.9995763772490712;
bool r605271 = r605269 <= r605270;
double r605272 = x;
double r605273 = 1.0;
double r605274 = r605273 / r605272;
double r605275 = r605272 - r605274;
double r605276 = y;
double r605277 = 1.1283791670955126;
double r605278 = r605277 * r605269;
double r605279 = r605272 * r605276;
double r605280 = r605278 - r605279;
double r605281 = r605273 / r605280;
double r605282 = r605276 * r605281;
double r605283 = r605272 + r605282;
double r605284 = r605271 ? r605275 : r605283;
return r605284;
}




Bits error versus x




Bits error versus y




Bits error versus z
Results
| Original | 2.8 |
|---|---|
| Target | 0.0 |
| Herbie | 1.2 |
if (exp z) < 0.9995763772490712Initial program 6.7
Taylor expanded around inf 0.5
if 0.9995763772490712 < (exp z) Initial program 1.4
rmApplied div-inv1.4
Final simplification1.2
herbie shell --seed 2020025 +o rules:numerics
(FPCore (x y z)
:name "Numeric.SpecFunctions:invErfc from math-functions-0.1.5.2, A"
:precision binary64
:herbie-target
(+ x (/ 1 (- (* (/ 1.1283791670955126 y) (exp z)) x)))
(+ x (/ y (- (* 1.1283791670955126 (exp z)) (* x y)))))