x + \frac{y}{1.1283791670955126 \cdot e^{z} - x \cdot y}\begin{array}{l}
\mathbf{if}\;e^{z} \le 0.0:\\
\;\;\;\;x + \left(\frac{-1}{x} - \frac{e^{z}}{x \cdot y} \cdot \frac{1.1283791670955126}{x}\right)\\
\mathbf{elif}\;e^{z} \le 1.0:\\
\;\;\;\;x + \frac{-y}{\mathsf{fma}\left(y, x, -\mathsf{fma}\left(z, \mathsf{fma}\left(0.5641895835477563, z, 1.1283791670955126\right), 1.1283791670955126\right)\right)}\\
\mathbf{else}:\\
\;\;\;\;x + \left(\left(\frac{y}{e^{z} \cdot 1.1283791670955126 - x \cdot y}\right)\right)\\
\end{array}double f(double x, double y, double z) {
double r19858045 = x;
double r19858046 = y;
double r19858047 = 1.1283791670955126;
double r19858048 = z;
double r19858049 = exp(r19858048);
double r19858050 = r19858047 * r19858049;
double r19858051 = r19858045 * r19858046;
double r19858052 = r19858050 - r19858051;
double r19858053 = r19858046 / r19858052;
double r19858054 = r19858045 + r19858053;
return r19858054;
}
double f(double x, double y, double z) {
double r19858055 = z;
double r19858056 = exp(r19858055);
double r19858057 = 0.0;
bool r19858058 = r19858056 <= r19858057;
double r19858059 = x;
double r19858060 = -1.0;
double r19858061 = r19858060 / r19858059;
double r19858062 = y;
double r19858063 = r19858059 * r19858062;
double r19858064 = r19858056 / r19858063;
double r19858065 = 1.1283791670955126;
double r19858066 = r19858065 / r19858059;
double r19858067 = r19858064 * r19858066;
double r19858068 = r19858061 - r19858067;
double r19858069 = r19858059 + r19858068;
double r19858070 = 1.0;
bool r19858071 = r19858056 <= r19858070;
double r19858072 = -r19858062;
double r19858073 = 0.5641895835477563;
double r19858074 = fma(r19858073, r19858055, r19858065);
double r19858075 = fma(r19858055, r19858074, r19858065);
double r19858076 = -r19858075;
double r19858077 = fma(r19858062, r19858059, r19858076);
double r19858078 = r19858072 / r19858077;
double r19858079 = r19858059 + r19858078;
double r19858080 = r19858056 * r19858065;
double r19858081 = r19858080 - r19858063;
double r19858082 = r19858062 / r19858081;
double r19858083 = /* ERROR: no posit support in C */;
double r19858084 = /* ERROR: no posit support in C */;
double r19858085 = r19858059 + r19858084;
double r19858086 = r19858071 ? r19858079 : r19858085;
double r19858087 = r19858058 ? r19858069 : r19858086;
return r19858087;
}




Bits error versus x




Bits error versus y




Bits error versus z
| Original | 2.7 |
|---|---|
| Target | 0.0 |
| Herbie | 3.1 |
if (exp z) < 0.0Initial program 7.1
Taylor expanded around inf 18.3
Simplified6.7
if 0.0 < (exp z) < 1.0Initial program 0.0
Taylor expanded around 0 0.1
Simplified0.1
rmApplied frac-2neg0.1
Simplified0.1
if 1.0 < (exp z) Initial program 3.5
rmApplied insert-posit165.4
Final simplification3.1
herbie shell --seed 2019164 +o rules:numerics
(FPCore (x y z)
:name "Numeric.SpecFunctions:invErfc from math-functions-0.1.5.2, A"
:herbie-target
(+ x (/ 1 (- (* (/ 1.1283791670955126 y) (exp z)) x)))
(+ x (/ y (- (* 1.1283791670955126 (exp z)) (* x y)))))