\left(e^{x} - 2\right) + e^{-x}\begin{array}{l}
\mathbf{if}\;\left(e^{x} - 2\right) + e^{-x} \le 0.001003621650167874079784269270021468400955:\\
\;\;\;\;\mathsf{fma}\left(x, x, \mathsf{fma}\left(\frac{1}{360}, {x}^{6}, \frac{1}{12} \cdot {x}^{4}\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\left(e^{x} - 2\right) + e^{-x}\\
\end{array}double f(double x) {
double r85200 = x;
double r85201 = exp(r85200);
double r85202 = 2.0;
double r85203 = r85201 - r85202;
double r85204 = -r85200;
double r85205 = exp(r85204);
double r85206 = r85203 + r85205;
return r85206;
}
double f(double x) {
double r85207 = x;
double r85208 = exp(r85207);
double r85209 = 2.0;
double r85210 = r85208 - r85209;
double r85211 = -r85207;
double r85212 = exp(r85211);
double r85213 = r85210 + r85212;
double r85214 = 0.001003621650167874;
bool r85215 = r85213 <= r85214;
double r85216 = 0.002777777777777778;
double r85217 = 6.0;
double r85218 = pow(r85207, r85217);
double r85219 = 0.08333333333333333;
double r85220 = 4.0;
double r85221 = pow(r85207, r85220);
double r85222 = r85219 * r85221;
double r85223 = fma(r85216, r85218, r85222);
double r85224 = fma(r85207, r85207, r85223);
double r85225 = r85215 ? r85224 : r85213;
return r85225;
}




Bits error versus x
| Original | 30.2 |
|---|---|
| Target | 0.0 |
| Herbie | 0.0 |
if (+ (- (exp x) 2.0) (exp (- x))) < 0.001003621650167874Initial program 30.7
Taylor expanded around 0 0.0
Simplified0.0
if 0.001003621650167874 < (+ (- (exp x) 2.0) (exp (- x))) Initial program 1.8
Final simplification0.0
herbie shell --seed 2019209 +o rules:numerics
(FPCore (x)
:name "exp2 (problem 3.3.7)"
:precision binary64
:herbie-target
(* 4 (pow (sinh (/ x 2)) 2))
(+ (- (exp x) 2) (exp (- x))))