e^{a \cdot x} - 1\begin{array}{l}
\mathbf{if}\;a \cdot x \le -0.001626719355739147552727952295015256822808:\\
\;\;\;\;\log \left(e^{e^{a \cdot x} - 1}\right)\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{1}{2}, {\left(x \cdot a\right)}^{2}, x \cdot a\right)\\
\end{array}double f(double a, double x) {
double r87706 = a;
double r87707 = x;
double r87708 = r87706 * r87707;
double r87709 = exp(r87708);
double r87710 = 1.0;
double r87711 = r87709 - r87710;
return r87711;
}
double f(double a, double x) {
double r87712 = a;
double r87713 = x;
double r87714 = r87712 * r87713;
double r87715 = -0.0016267193557391476;
bool r87716 = r87714 <= r87715;
double r87717 = exp(r87714);
double r87718 = 1.0;
double r87719 = r87717 - r87718;
double r87720 = exp(r87719);
double r87721 = log(r87720);
double r87722 = 0.5;
double r87723 = r87713 * r87712;
double r87724 = 2.0;
double r87725 = pow(r87723, r87724);
double r87726 = fma(r87722, r87725, r87723);
double r87727 = r87716 ? r87721 : r87726;
return r87727;
}




Bits error versus a




Bits error versus x
| Original | 30.0 |
|---|---|
| Target | 0.2 |
| Herbie | 0.5 |
if (* a x) < -0.0016267193557391476Initial program 0.0
rmApplied add-log-exp0.0
Applied add-log-exp0.0
Applied diff-log0.0
Simplified0.0
if -0.0016267193557391476 < (* a x) Initial program 44.7
Taylor expanded around 0 14.7
Simplified14.7
Taylor expanded around 0 8.4
Simplified8.4
rmApplied pow-prod-down0.7
Simplified0.7
Final simplification0.5
herbie shell --seed 2020001 +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))