e^{a \cdot x} - 1\begin{array}{l}
\mathbf{if}\;a \cdot x \le -6.39764424539762286 \cdot 10^{-9}:\\
\;\;\;\;\mathsf{fma}\left(\sqrt{e^{a \cdot x}}, \sqrt{e^{a \cdot x}}, -1\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(x, a, \log \left({\left(e^{x \cdot x}\right)}^{\left(\mathsf{fma}\left(\frac{1}{2}, a \cdot a, \left(\frac{1}{6} \cdot {a}^{3}\right) \cdot x\right)\right)}\right)\right)\\
\end{array}double f(double a, double x) {
double r145882 = a;
double r145883 = x;
double r145884 = r145882 * r145883;
double r145885 = exp(r145884);
double r145886 = 1.0;
double r145887 = r145885 - r145886;
return r145887;
}
double f(double a, double x) {
double r145888 = a;
double r145889 = x;
double r145890 = r145888 * r145889;
double r145891 = -6.397644245397623e-09;
bool r145892 = r145890 <= r145891;
double r145893 = exp(r145890);
double r145894 = sqrt(r145893);
double r145895 = 1.0;
double r145896 = -r145895;
double r145897 = fma(r145894, r145894, r145896);
double r145898 = r145889 * r145889;
double r145899 = exp(r145898);
double r145900 = 0.5;
double r145901 = r145888 * r145888;
double r145902 = 0.16666666666666666;
double r145903 = 3.0;
double r145904 = pow(r145888, r145903);
double r145905 = r145902 * r145904;
double r145906 = r145905 * r145889;
double r145907 = fma(r145900, r145901, r145906);
double r145908 = pow(r145899, r145907);
double r145909 = log(r145908);
double r145910 = fma(r145889, r145888, r145909);
double r145911 = r145892 ? r145897 : r145910;
return r145911;
}




Bits error versus a




Bits error versus x
| Original | 29.7 |
|---|---|
| Target | 0.2 |
| Herbie | 3.6 |
if (* a x) < -6.397644245397623e-09Initial program 0.3
rmApplied add-sqr-sqrt0.3
Applied fma-neg0.3
if -6.397644245397623e-09 < (* a x) Initial program 44.7
Taylor expanded around 0 14.1
Simplified11.3
rmApplied add-log-exp11.4
Simplified5.2
Final simplification3.6
herbie shell --seed 2020042 +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))