\frac{e^{x}}{e^{x} - 1}\begin{array}{l}
\mathbf{if}\;e^{x} \le 1.6351282551502975 \cdot 10^{-4}:\\
\;\;\;\;\frac{1}{1 - \frac{1}{e^{x}}}\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(-x, \frac{1}{12}, \mathsf{fma}\left({x}^{3}, \frac{7}{720}, \frac{\frac{1}{2}}{x}\right)\right) \cdot \left(e^{x} + 1\right)\\
\end{array}double f(double x) {
double r88592 = x;
double r88593 = exp(r88592);
double r88594 = 1.0;
double r88595 = r88593 - r88594;
double r88596 = r88593 / r88595;
return r88596;
}
double f(double x) {
double r88597 = x;
double r88598 = exp(r88597);
double r88599 = 0.00016351282551502975;
bool r88600 = r88598 <= r88599;
double r88601 = 1.0;
double r88602 = 1.0;
double r88603 = r88602 / r88598;
double r88604 = r88601 - r88603;
double r88605 = r88601 / r88604;
double r88606 = -r88597;
double r88607 = 0.08333333333333333;
double r88608 = 3.0;
double r88609 = pow(r88597, r88608);
double r88610 = 0.009722222222222222;
double r88611 = 0.5;
double r88612 = r88611 / r88597;
double r88613 = fma(r88609, r88610, r88612);
double r88614 = fma(r88606, r88607, r88613);
double r88615 = r88598 + r88602;
double r88616 = r88614 * r88615;
double r88617 = r88600 ? r88605 : r88616;
return r88617;
}




Bits error versus x
| Original | 41.2 |
|---|---|
| Target | 40.7 |
| Herbie | 0.9 |
if (exp x) < 0.00016351282551502975Initial program 0.0
rmApplied clear-num0.0
Simplified0.0
if 0.00016351282551502975 < (exp x) Initial program 61.6
rmApplied flip--61.6
Applied associate-/r/61.6
Simplified61.6
Taylor expanded around 0 1.3
Simplified1.3
Final simplification0.9
herbie shell --seed 2020062 +o rules:numerics
(FPCore (x)
:name "expq2 (section 3.11)"
:precision binary64
:herbie-target
(/ 1 (- 1 (exp (- x))))
(/ (exp x) (- (exp x) 1)))