\frac{e^{x} - 1}{x}\begin{array}{l}
\mathbf{if}\;x \le -9.0413827379038481 \cdot 10^{-5}:\\
\;\;\;\;\mathsf{expm1}\left(\mathsf{log1p}\left(\frac{\frac{\mathsf{fma}\left(-1, 1, e^{x + x}\right)}{e^{x} + 1}}{x}\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{1}{6}, {x}^{2}, \mathsf{fma}\left(\frac{1}{2}, x, 1\right)\right)\\
\end{array}double f(double x) {
double r91018 = x;
double r91019 = exp(r91018);
double r91020 = 1.0;
double r91021 = r91019 - r91020;
double r91022 = r91021 / r91018;
return r91022;
}
double f(double x) {
double r91023 = x;
double r91024 = -9.041382737903848e-05;
bool r91025 = r91023 <= r91024;
double r91026 = 1.0;
double r91027 = -r91026;
double r91028 = r91023 + r91023;
double r91029 = exp(r91028);
double r91030 = fma(r91027, r91026, r91029);
double r91031 = exp(r91023);
double r91032 = r91031 + r91026;
double r91033 = r91030 / r91032;
double r91034 = r91033 / r91023;
double r91035 = log1p(r91034);
double r91036 = expm1(r91035);
double r91037 = 0.16666666666666666;
double r91038 = 2.0;
double r91039 = pow(r91023, r91038);
double r91040 = 0.5;
double r91041 = 1.0;
double r91042 = fma(r91040, r91023, r91041);
double r91043 = fma(r91037, r91039, r91042);
double r91044 = r91025 ? r91036 : r91043;
return r91044;
}




Bits error versus x
| Original | 40.1 |
|---|---|
| Target | 40.5 |
| Herbie | 0.3 |
if x < -9.041382737903848e-05Initial program 0.1
rmApplied flip--0.1
Simplified0.1
rmApplied expm1-log1p-u0.1
if -9.041382737903848e-05 < x Initial program 60.1
Taylor expanded around 0 0.4
Simplified0.4
Final simplification0.3
herbie shell --seed 2020100 +o rules:numerics
(FPCore (x)
:name "Kahan's exp quotient"
:precision binary64
:herbie-target
(if (and (< x 1) (> x -1)) (/ (- (exp x) 1) (log (exp x))) (/ (- (exp x) 1) x))
(/ (- (exp x) 1) x))