\frac{e^{x}}{e^{x} - 1}\begin{array}{l}
\mathbf{if}\;e^{x} \le 2.32657494077244701 \cdot 10^{-52}:\\
\;\;\;\;\frac{e^{x}}{\mathsf{fma}\left(\sqrt{\sqrt{e^{x}}} \cdot \sqrt{\sqrt{e^{x}}}, \sqrt{e^{x}}, -1\right)}\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{1}{12}, x, \frac{1}{x}\right) + \frac{1}{2}\\
\end{array}double f(double x) {
double r168802 = x;
double r168803 = exp(r168802);
double r168804 = 1.0;
double r168805 = r168803 - r168804;
double r168806 = r168803 / r168805;
return r168806;
}
double f(double x) {
double r168807 = x;
double r168808 = exp(r168807);
double r168809 = 2.326574940772447e-52;
bool r168810 = r168808 <= r168809;
double r168811 = sqrt(r168808);
double r168812 = sqrt(r168811);
double r168813 = r168812 * r168812;
double r168814 = 1.0;
double r168815 = -r168814;
double r168816 = fma(r168813, r168811, r168815);
double r168817 = r168808 / r168816;
double r168818 = 0.08333333333333333;
double r168819 = 1.0;
double r168820 = r168819 / r168807;
double r168821 = fma(r168818, r168807, r168820);
double r168822 = 0.5;
double r168823 = r168821 + r168822;
double r168824 = r168810 ? r168817 : r168823;
return r168824;
}




Bits error versus x
| Original | 40.9 |
|---|---|
| Target | 40.4 |
| Herbie | 0.8 |
if (exp x) < 2.326574940772447e-52Initial program 0
rmApplied add-sqr-sqrt0
Applied fma-neg0
rmApplied add-sqr-sqrt0
Applied sqrt-prod0
if 2.326574940772447e-52 < (exp x) Initial program 61.5
Taylor expanded around 0 1.2
Simplified1.2
Final simplification0.8
herbie shell --seed 2020020 +o rules:numerics
(FPCore (x)
:name "expq2 (section 3.11)"
:precision binary64
:herbie-target
(/ 1 (- 1 (exp (- x))))
(/ (exp x) (- (exp x) 1)))