\frac{\left(1 + \frac{1}{\varepsilon}\right) \cdot e^{-\left(1 - \varepsilon\right) \cdot x} - \left(\frac{1}{\varepsilon} - 1\right) \cdot e^{-\left(1 + \varepsilon\right) \cdot x}}{2}\begin{array}{l}
\mathbf{if}\;x \le 9.6260562945900503:\\
\;\;\;\;\frac{\mathsf{fma}\left({x}^{3}, 0.66666666666666674, 2 - 1 \cdot {x}^{2}\right)}{2}\\
\mathbf{else}:\\
\;\;\;\;\frac{\mathsf{fma}\left(1, \frac{e^{x \cdot \varepsilon - 1 \cdot x}}{\varepsilon}, 1 \cdot \left(\frac{1}{\mathsf{expm1}\left(e^{\log \left(\mathsf{log1p}\left(e^{\mathsf{fma}\left(x, \varepsilon, 1 \cdot x\right)}\right)\right)}\right)} + e^{x \cdot \varepsilon - 1 \cdot x}\right) - 1 \cdot \frac{e^{-\left(x \cdot \varepsilon + 1 \cdot x\right)}}{\varepsilon}\right)}{2}\\
\end{array}double f(double x, double eps) {
double r30706 = 1.0;
double r30707 = eps;
double r30708 = r30706 / r30707;
double r30709 = r30706 + r30708;
double r30710 = r30706 - r30707;
double r30711 = x;
double r30712 = r30710 * r30711;
double r30713 = -r30712;
double r30714 = exp(r30713);
double r30715 = r30709 * r30714;
double r30716 = r30708 - r30706;
double r30717 = r30706 + r30707;
double r30718 = r30717 * r30711;
double r30719 = -r30718;
double r30720 = exp(r30719);
double r30721 = r30716 * r30720;
double r30722 = r30715 - r30721;
double r30723 = 2.0;
double r30724 = r30722 / r30723;
return r30724;
}
double f(double x, double eps) {
double r30725 = x;
double r30726 = 9.62605629459005;
bool r30727 = r30725 <= r30726;
double r30728 = 3.0;
double r30729 = pow(r30725, r30728);
double r30730 = 0.6666666666666667;
double r30731 = 2.0;
double r30732 = 1.0;
double r30733 = 2.0;
double r30734 = pow(r30725, r30733);
double r30735 = r30732 * r30734;
double r30736 = r30731 - r30735;
double r30737 = fma(r30729, r30730, r30736);
double r30738 = r30737 / r30731;
double r30739 = eps;
double r30740 = r30725 * r30739;
double r30741 = r30732 * r30725;
double r30742 = r30740 - r30741;
double r30743 = exp(r30742);
double r30744 = r30743 / r30739;
double r30745 = 1.0;
double r30746 = fma(r30725, r30739, r30741);
double r30747 = exp(r30746);
double r30748 = log1p(r30747);
double r30749 = log(r30748);
double r30750 = exp(r30749);
double r30751 = expm1(r30750);
double r30752 = r30745 / r30751;
double r30753 = r30752 + r30743;
double r30754 = r30732 * r30753;
double r30755 = r30740 + r30741;
double r30756 = -r30755;
double r30757 = exp(r30756);
double r30758 = r30757 / r30739;
double r30759 = r30732 * r30758;
double r30760 = r30754 - r30759;
double r30761 = fma(r30732, r30744, r30760);
double r30762 = r30761 / r30731;
double r30763 = r30727 ? r30738 : r30762;
return r30763;
}



Bits error versus x



Bits error versus eps
if x < 9.62605629459005Initial program 38.9
Taylor expanded around 0 1.3
Simplified1.3
if 9.62605629459005 < x Initial program 0.4
Taylor expanded around inf 0.4
Simplified0.4
rmApplied expm1-log1p-u0.4
rmApplied add-exp-log0.4
Final simplification1.1
herbie shell --seed 2020021 +o rules:numerics
(FPCore (x eps)
:name "NMSE Section 6.1 mentioned, A"
:precision binary64
(/ (- (* (+ 1 (/ 1 eps)) (exp (- (* (- 1 eps) x)))) (* (- (/ 1 eps) 1) (exp (- (* (+ 1 eps) x))))) 2))