e^{a \cdot x} - 1\begin{array}{l}
\mathbf{if}\;a \cdot x \le -1.335189100226837470869581266346825393354 \cdot 10^{-9}:\\
\;\;\;\;e^{a \cdot x} - 1\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(a, x, \mathsf{fma}\left(\frac{1}{2}, a \cdot a, \frac{1}{6} \cdot \left(\left(a \cdot \left(a \cdot x\right)\right) \cdot a\right)\right) \cdot \left(x \cdot x\right)\right)\\
\end{array}double f(double a, double x) {
double r56193 = a;
double r56194 = x;
double r56195 = r56193 * r56194;
double r56196 = exp(r56195);
double r56197 = 1.0;
double r56198 = r56196 - r56197;
return r56198;
}
double f(double a, double x) {
double r56199 = a;
double r56200 = x;
double r56201 = r56199 * r56200;
double r56202 = -1.3351891002268375e-09;
bool r56203 = r56201 <= r56202;
double r56204 = exp(r56201);
double r56205 = 1.0;
double r56206 = r56204 - r56205;
double r56207 = 0.5;
double r56208 = r56199 * r56199;
double r56209 = 0.16666666666666666;
double r56210 = r56199 * r56201;
double r56211 = r56210 * r56199;
double r56212 = r56209 * r56211;
double r56213 = fma(r56207, r56208, r56212);
double r56214 = r56200 * r56200;
double r56215 = r56213 * r56214;
double r56216 = fma(r56199, r56200, r56215);
double r56217 = r56203 ? r56206 : r56216;
return r56217;
}




Bits error versus a




Bits error versus x
| Original | 29.4 |
|---|---|
| Target | 0.2 |
| Herbie | 5.2 |
if (* a x) < -1.3351891002268375e-09Initial program 0.3
if -1.3351891002268375e-09 < (* a x) Initial program 44.4
Taylor expanded around 0 14.1
Simplified11.0
rmApplied cube-mult11.0
Applied associate-*l*7.8
Simplified7.8
Final simplification5.2
herbie shell --seed 2019196 +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))