e^{a \cdot x} - 1\begin{array}{l}
\mathbf{if}\;a \cdot x \le -0.01978988839323105736189845060835068579763:\\
\;\;\;\;\sqrt[3]{e^{x \cdot \mathsf{fma}\left(2, a, a\right)}} - 1\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\left(a \cdot x\right) \cdot \left(a \cdot x\right), \mathsf{fma}\left(\frac{1}{6}, a \cdot x, \frac{1}{2}\right), a \cdot x\right)\\
\end{array}double f(double a, double x) {
double r8374591 = a;
double r8374592 = x;
double r8374593 = r8374591 * r8374592;
double r8374594 = exp(r8374593);
double r8374595 = 1.0;
double r8374596 = r8374594 - r8374595;
return r8374596;
}
double f(double a, double x) {
double r8374597 = a;
double r8374598 = x;
double r8374599 = r8374597 * r8374598;
double r8374600 = -0.019789888393231057;
bool r8374601 = r8374599 <= r8374600;
double r8374602 = 2.0;
double r8374603 = fma(r8374602, r8374597, r8374597);
double r8374604 = r8374598 * r8374603;
double r8374605 = exp(r8374604);
double r8374606 = cbrt(r8374605);
double r8374607 = 1.0;
double r8374608 = r8374606 - r8374607;
double r8374609 = r8374599 * r8374599;
double r8374610 = 0.16666666666666666;
double r8374611 = 0.5;
double r8374612 = fma(r8374610, r8374599, r8374611);
double r8374613 = fma(r8374609, r8374612, r8374599);
double r8374614 = r8374601 ? r8374608 : r8374613;
return r8374614;
}




Bits error versus a




Bits error versus x
| Original | 29.7 |
|---|---|
| Target | 0.1 |
| Herbie | 0.4 |
if (* a x) < -0.019789888393231057Initial program 0.0
rmApplied add-cbrt-cube0.0
Simplified0.0
if -0.019789888393231057 < (* a x) Initial program 44.0
Taylor expanded around 0 15.1
Simplified0.6
Taylor expanded around inf 15.1
Simplified0.6
Final simplification0.4
herbie shell --seed 2019173 +o rules:numerics
(FPCore (a x)
:name "expax (section 3.5)"
:herbie-expected 14
:herbie-target
(if (< (fabs (* a x)) 0.1) (* (* a x) (+ 1.0 (+ (/ (* a x) 2.0) (/ (pow (* a x) 2.0) 6.0)))) (- (exp (* a x)) 1.0))
(- (exp (* a x)) 1.0))