\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 326.0265778093990434172155801206827163696:\\
\;\;\;\;\frac{\mathsf{fma}\left(-0.6666666666666666296592325124947819858789, \frac{{x}^{6}}{3 \cdot 3}, \mathsf{fma}\left(0.07407407407407406996213694583275355398655, {x}^{6}, \mathsf{fma}\left(0.6666666666666666296592325124947819858789, {x}^{3}, 2\right)\right)\right) - \left(x \cdot x\right) \cdot 1}{2}\\
\mathbf{else}:\\
\;\;\;\;\frac{\left(1 + \frac{1}{\varepsilon}\right) \cdot e^{x \cdot \left(\varepsilon - 1\right)} - e^{\left(-x\right) \cdot \left(1 + \varepsilon\right)} \cdot \left(\frac{1}{\varepsilon} - 1\right)}{2}\\
\end{array}double f(double x, double eps) {
double r50566 = 1.0;
double r50567 = eps;
double r50568 = r50566 / r50567;
double r50569 = r50566 + r50568;
double r50570 = r50566 - r50567;
double r50571 = x;
double r50572 = r50570 * r50571;
double r50573 = -r50572;
double r50574 = exp(r50573);
double r50575 = r50569 * r50574;
double r50576 = r50568 - r50566;
double r50577 = r50566 + r50567;
double r50578 = r50577 * r50571;
double r50579 = -r50578;
double r50580 = exp(r50579);
double r50581 = r50576 * r50580;
double r50582 = r50575 - r50581;
double r50583 = 2.0;
double r50584 = r50582 / r50583;
return r50584;
}
double f(double x, double eps) {
double r50585 = x;
double r50586 = 326.02657780939904;
bool r50587 = r50585 <= r50586;
double r50588 = 0.6666666666666666;
double r50589 = -r50588;
double r50590 = 6.0;
double r50591 = pow(r50585, r50590);
double r50592 = 3.0;
double r50593 = r50592 * r50592;
double r50594 = r50591 / r50593;
double r50595 = 0.07407407407407407;
double r50596 = 3.0;
double r50597 = pow(r50585, r50596);
double r50598 = 2.0;
double r50599 = fma(r50588, r50597, r50598);
double r50600 = fma(r50595, r50591, r50599);
double r50601 = fma(r50589, r50594, r50600);
double r50602 = r50585 * r50585;
double r50603 = 1.0;
double r50604 = r50602 * r50603;
double r50605 = r50601 - r50604;
double r50606 = r50605 / r50598;
double r50607 = eps;
double r50608 = r50603 / r50607;
double r50609 = r50603 + r50608;
double r50610 = r50607 - r50603;
double r50611 = r50585 * r50610;
double r50612 = exp(r50611);
double r50613 = r50609 * r50612;
double r50614 = -r50585;
double r50615 = r50603 + r50607;
double r50616 = r50614 * r50615;
double r50617 = exp(r50616);
double r50618 = r50608 - r50603;
double r50619 = r50617 * r50618;
double r50620 = r50613 - r50619;
double r50621 = r50620 / r50598;
double r50622 = r50587 ? r50606 : r50621;
return r50622;
}



Bits error versus x



Bits error versus eps
if x < 326.02657780939904Initial program 39.5
Taylor expanded around 0 1.3
Simplified1.3
rmApplied expm1-log1p-u2.9
Simplified2.9
Taylor expanded around 0 1.3
Simplified1.3
if 326.02657780939904 < x Initial program 0.2
Taylor expanded around inf 0.2
Simplified0.2
Final simplification1.1
herbie shell --seed 2019195 +o rules:numerics
(FPCore (x eps)
:name "NMSE Section 6.1 mentioned, A"
(/ (- (* (+ 1.0 (/ 1.0 eps)) (exp (- (* (- 1.0 eps) x)))) (* (- (/ 1.0 eps) 1.0) (exp (- (* (+ 1.0 eps) x))))) 2.0))