\frac{e^{x} - 1}{x}\begin{array}{l}
\mathbf{if}\;x \le -1.69715010585821388 \cdot 10^{-4}:\\
\;\;\;\;\frac{\frac{\mathsf{fma}\left(-1, 1, e^{x + x}\right)}{e^{x} + 1}}{x}\\
\mathbf{else}:\\
\;\;\;\;\mathsf{expm1}\left(\mathsf{fma}\left(\frac{5}{96}, {x}^{2}, \mathsf{fma}\left(\frac{1}{4}, x, \log 2\right)\right)\right)\\
\end{array}double f(double x) {
double r76663 = x;
double r76664 = exp(r76663);
double r76665 = 1.0;
double r76666 = r76664 - r76665;
double r76667 = r76666 / r76663;
return r76667;
}
double f(double x) {
double r76668 = x;
double r76669 = -0.0001697150105858214;
bool r76670 = r76668 <= r76669;
double r76671 = 1.0;
double r76672 = -r76671;
double r76673 = r76668 + r76668;
double r76674 = exp(r76673);
double r76675 = fma(r76672, r76671, r76674);
double r76676 = exp(r76668);
double r76677 = r76676 + r76671;
double r76678 = r76675 / r76677;
double r76679 = r76678 / r76668;
double r76680 = 0.052083333333333336;
double r76681 = 2.0;
double r76682 = pow(r76668, r76681);
double r76683 = 0.25;
double r76684 = log(r76681);
double r76685 = fma(r76683, r76668, r76684);
double r76686 = fma(r76680, r76682, r76685);
double r76687 = expm1(r76686);
double r76688 = r76670 ? r76679 : r76687;
return r76688;
}




Bits error versus x
| Original | 39.8 |
|---|---|
| Target | 40.2 |
| Herbie | 0.4 |
if x < -0.0001697150105858214Initial program 0.1
rmApplied flip--0.1
Simplified0.0
if -0.0001697150105858214 < x Initial program 60.0
Taylor expanded around 0 0.5
Simplified0.5
rmApplied expm1-log1p-u0.5
Taylor expanded around 0 0.5
Simplified0.5
Final simplification0.4
herbie shell --seed 2020057 +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))