e^{a \cdot x} - 1\begin{array}{l}
\mathbf{if}\;a \cdot x \le -3.7825639584990174123449858771539577873 \cdot 10^{-7}:\\
\;\;\;\;e^{a \cdot x} - 1\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(a, x, \log \left({\left(e^{x}\right)}^{\left(\mathsf{fma}\left(a \cdot a, \frac{1}{2}, {a}^{3} \cdot \left(x \cdot \frac{1}{6}\right)\right) \cdot x\right)}\right)\right)\\
\end{array}double f(double a, double x) {
double r91651 = a;
double r91652 = x;
double r91653 = r91651 * r91652;
double r91654 = exp(r91653);
double r91655 = 1.0;
double r91656 = r91654 - r91655;
return r91656;
}
double f(double a, double x) {
double r91657 = a;
double r91658 = x;
double r91659 = r91657 * r91658;
double r91660 = -3.7825639584990174e-07;
bool r91661 = r91659 <= r91660;
double r91662 = exp(r91659);
double r91663 = 1.0;
double r91664 = r91662 - r91663;
double r91665 = exp(r91658);
double r91666 = r91657 * r91657;
double r91667 = 0.5;
double r91668 = 3.0;
double r91669 = pow(r91657, r91668);
double r91670 = 0.16666666666666666;
double r91671 = r91658 * r91670;
double r91672 = r91669 * r91671;
double r91673 = fma(r91666, r91667, r91672);
double r91674 = r91673 * r91658;
double r91675 = pow(r91665, r91674);
double r91676 = log(r91675);
double r91677 = fma(r91657, r91658, r91676);
double r91678 = r91661 ? r91664 : r91677;
return r91678;
}




Bits error versus a




Bits error versus x
| Original | 29.8 |
|---|---|
| Target | 0.1 |
| Herbie | 3.4 |
if (* a x) < -3.7825639584990174e-07Initial program 0.1
if -3.7825639584990174e-07 < (* a x) Initial program 44.9
Taylor expanded around 0 15.3
Simplified11.8
rmApplied add-log-exp12.0
Simplified5.1
Final simplification3.4
herbie shell --seed 2019174 +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))