e^{a \cdot x} - 1\begin{array}{l}
\mathbf{if}\;a \cdot x \le -6.952525294693658350925354570681857779846 \cdot 10^{-7}:\\
\;\;\;\;e^{a \cdot x} - 1\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{1}{2}, {a}^{2} \cdot {x}^{2}, \mathsf{fma}\left(\frac{1}{6}, {a}^{3} \cdot {x}^{3}, a \cdot x\right)\right)\\
\end{array}double f(double a, double x) {
double r62833 = a;
double r62834 = x;
double r62835 = r62833 * r62834;
double r62836 = exp(r62835);
double r62837 = 1.0;
double r62838 = r62836 - r62837;
return r62838;
}
double f(double a, double x) {
double r62839 = a;
double r62840 = x;
double r62841 = r62839 * r62840;
double r62842 = -6.952525294693658e-07;
bool r62843 = r62841 <= r62842;
double r62844 = exp(r62841);
double r62845 = 1.0;
double r62846 = r62844 - r62845;
double r62847 = 0.5;
double r62848 = 2.0;
double r62849 = pow(r62839, r62848);
double r62850 = pow(r62840, r62848);
double r62851 = r62849 * r62850;
double r62852 = 0.16666666666666666;
double r62853 = 3.0;
double r62854 = pow(r62839, r62853);
double r62855 = pow(r62840, r62853);
double r62856 = r62854 * r62855;
double r62857 = fma(r62852, r62856, r62841);
double r62858 = fma(r62847, r62851, r62857);
double r62859 = r62843 ? r62846 : r62858;
return r62859;
}




Bits error versus a




Bits error versus x
| Original | 29.0 |
|---|---|
| Target | 0.2 |
| Herbie | 9.3 |
if (* a x) < -6.952525294693658e-07Initial program 0.2
if -6.952525294693658e-07 < (* a x) Initial program 44.5
Taylor expanded around 0 14.3
Simplified14.3
Final simplification9.3
herbie shell --seed 2020002 +o rules:numerics
(FPCore (a x)
:name "expax (section 3.5)"
:precision binary64
:herbie-expected 14
:herbie-target
(if (< (fabs (* a x)) 0.1) (* (* a x) (+ 1 (+ (/ (* a x) 2) (/ (pow (* a x) 2) 6)))) (- (exp (* a x)) 1))
(- (exp (* a x)) 1))