e^{a \cdot x} - 1\begin{array}{l}
\mathbf{if}\;a \cdot x \leq -1.283265312368245 \cdot 10^{-05}:\\
\;\;\;\;e^{a \cdot x} - 1\\
\mathbf{elif}\;a \cdot x \leq -1.0908319111938347 \cdot 10^{-40} \lor \neg \left(a \cdot x \leq -4.132494059883518 \cdot 10^{-139}\right):\\
\;\;\;\;a \cdot x + a \cdot \left(\left(a \cdot 0.5\right) \cdot \left(x \cdot x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;x \cdot \left(a + \left(a \cdot \left(a \cdot \left(x \cdot 0.5\right)\right) + x \cdot \left(x \cdot \left(0.16666666666666666 \cdot {a}^{3}\right)\right)\right)\right)\\
\end{array}double code(double a, double x) {
return ((double) (((double) exp(((double) (a * x)))) - 1.0));
}
double code(double a, double x) {
double VAR;
if ((((double) (a * x)) <= -1.283265312368245e-05)) {
VAR = ((double) (((double) exp(((double) (a * x)))) - 1.0));
} else {
double VAR_1;
if (((((double) (a * x)) <= -1.0908319111938347e-40) || !(((double) (a * x)) <= -4.132494059883518e-139))) {
VAR_1 = ((double) (((double) (a * x)) + ((double) (a * ((double) (((double) (a * 0.5)) * ((double) (x * x))))))));
} else {
VAR_1 = ((double) (x * ((double) (a + ((double) (((double) (a * ((double) (a * ((double) (x * 0.5)))))) + ((double) (x * ((double) (x * ((double) (0.16666666666666666 * ((double) pow(a, 3.0))))))))))))));
}
VAR = VAR_1;
}
return VAR;
}




Bits error versus a




Bits error versus x
Results
| Original | 29.0 |
|---|---|
| Target | 0.2 |
| Herbie | 3.3 |
if (* a x) < -1.28326531236824496e-5Initial program 0.1
if -1.28326531236824496e-5 < (* a x) < -1.0908319111938347e-40 or -4.13249405988351797e-139 < (* a x) Initial program 41.4
Taylor expanded around 0 11.7
Simplified6.5
Taylor expanded around 0 6.6
Simplified3.7
if -1.0908319111938347e-40 < (* a x) < -4.13249405988351797e-139Initial program 61.5
Taylor expanded around 0 27.4
Simplified13.5
rmApplied distribute-lft-in13.5
Simplified13.5
Final simplification3.3
herbie shell --seed 2020196
(FPCore (a x)
:name "expax (section 3.5)"
:precision binary64
: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))