Average Error: 29.4 → 0.3
Time: 1.1min
Precision: binary64
Cost: 33217
\[e^{a \cdot x} - 1\]
↓
\[\begin{array}{l}
\mathbf{if}\;a \cdot x \leq -0.0020509167217338674:\\
\;\;\;\;\frac{\log \left(e^{{\left(e^{a \cdot x}\right)}^{2} + -1}\right)}{e^{a \cdot x} + 1}\\
\mathbf{else}:\\
\;\;\;\;a \cdot x + \left({\left(a \cdot x\right)}^{4} \cdot 0.041666666666666664 + {\left(a \cdot x\right)}^{2} \cdot \left(0.5 + \left(a \cdot x\right) \cdot 0.16666666666666666\right)\right)\\
\end{array}\]
e^{a \cdot x} - 1↓
\begin{array}{l}
\mathbf{if}\;a \cdot x \leq -0.0020509167217338674:\\
\;\;\;\;\frac{\log \left(e^{{\left(e^{a \cdot x}\right)}^{2} + -1}\right)}{e^{a \cdot x} + 1}\\
\mathbf{else}:\\
\;\;\;\;a \cdot x + \left({\left(a \cdot x\right)}^{4} \cdot 0.041666666666666664 + {\left(a \cdot x\right)}^{2} \cdot \left(0.5 + \left(a \cdot x\right) \cdot 0.16666666666666666\right)\right)\\
\end{array}(FPCore (a x) :precision binary64 (- (exp (* a x)) 1.0))
↓
(FPCore (a x)
:precision binary64
(if (<= (* a x) -0.0020509167217338674)
(/ (log (exp (+ (pow (exp (* a x)) 2.0) -1.0))) (+ (exp (* a x)) 1.0))
(+
(* a x)
(+
(* (pow (* a x) 4.0) 0.041666666666666664)
(* (pow (* a x) 2.0) (+ 0.5 (* (* a x) 0.16666666666666666)))))))double code(double a, double x) {
return exp(a * x) - 1.0;
}
↓
double code(double a, double x) {
double tmp;
if ((a * x) <= -0.0020509167217338674) {
tmp = log(exp(pow(exp(a * x), 2.0) + -1.0)) / (exp(a * x) + 1.0);
} else {
tmp = (a * x) + ((pow((a * x), 4.0) * 0.041666666666666664) + (pow((a * x), 2.0) * (0.5 + ((a * x) * 0.16666666666666666))));
}
return tmp;
}
Try it out
Enter valid numbers for all inputs
Target
| Original | 29.4 |
|---|
| Target | 0.2 |
|---|
| Herbie | 0.3 |
|---|
\[\begin{array}{l}
\mathbf{if}\;\left|a \cdot x\right| < 0.1:\\
\;\;\;\;\left(a \cdot x\right) \cdot \left(1 + \left(\frac{a \cdot x}{2} + \frac{{\left(a \cdot x\right)}^{2}}{6}\right)\right)\\
\mathbf{else}:\\
\;\;\;\;e^{a \cdot x} - 1\\
\end{array}\]
Alternatives
| Alternative 1 |
|---|
| Error | 0.3 |
|---|
| Cost | 14721 |
|---|
\[\begin{array}{l}
\mathbf{if}\;a \cdot x \leq -0.0020509167217338674:\\
\;\;\;\;\frac{-1 + e^{a \cdot \left(x + x\right)}}{e^{a \cdot x} + 1}\\
\mathbf{else}:\\
\;\;\;\;a \cdot x + \left({\left(a \cdot x\right)}^{4} \cdot 0.041666666666666664 + {\left(a \cdot x\right)}^{2} \cdot \left(0.5 + \left(a \cdot x\right) \cdot 0.16666666666666666\right)\right)\\
\end{array}\]
| Alternative 2 |
|---|
| Error | 0.3 |
|---|
| Cost | 14273 |
|---|
\[\begin{array}{l}
\mathbf{if}\;a \cdot x \leq -0.0020509167217338674:\\
\;\;\;\;\frac{-1 + e^{a \cdot \left(x + x\right)}}{e^{a \cdot x} + 1}\\
\mathbf{else}:\\
\;\;\;\;a \cdot x + \left({\left(a \cdot x\right)}^{2} \cdot 0.5\right) \cdot e^{\left(a \cdot x\right) \cdot 0.3333333333333333}\\
\end{array}\]
| Alternative 3 |
|---|
| Error | 0.3 |
|---|
| Cost | 14081 |
|---|
\[\begin{array}{l}
\mathbf{if}\;a \cdot x \leq -0.0020509167217338674:\\
\;\;\;\;\frac{-1 + e^{a \cdot \left(x + x\right)}}{e^{a \cdot x} + 1}\\
\mathbf{else}:\\
\;\;\;\;a \cdot x + {\left(a \cdot x\right)}^{2} \cdot \left(0.5 + \left(a \cdot x\right) \cdot 0.16666666666666666\right)\\
\end{array}\]
| Alternative 4 |
|---|
| Error | 0.3 |
|---|
| Cost | 7873 |
|---|
\[\begin{array}{l}
\mathbf{if}\;a \cdot x \leq -0.0020509167217338674:\\
\;\;\;\;e^{a \cdot x} + -1\\
\mathbf{else}:\\
\;\;\;\;a \cdot x + {\left(a \cdot x\right)}^{2} \cdot \left(0.5 + \left(a \cdot x\right) \cdot 0.16666666666666666\right)\\
\end{array}\]
| Alternative 5 |
|---|
| Error | 0.4 |
|---|
| Cost | 7169 |
|---|
\[\begin{array}{l}
\mathbf{if}\;a \cdot x \leq -6.310949614038394 \cdot 10^{-06}:\\
\;\;\;\;e^{a \cdot x} + -1\\
\mathbf{else}:\\
\;\;\;\;x \cdot \left(a + 0.5 \cdot \left(a \cdot \left(a \cdot x\right)\right)\right)\\
\end{array}\]
| Alternative 6 |
|---|
| Error | 0.9 |
|---|
| Cost | 1153 |
|---|
\[\begin{array}{l}
\mathbf{if}\;a \cdot x \leq -112941.26366565312:\\
\;\;\;\;-1\\
\mathbf{else}:\\
\;\;\;\;x \cdot \left(a + 0.5 \cdot \left(a \cdot \left(a \cdot x\right)\right)\right)\\
\end{array}\]
| Alternative 7 |
|---|
| Error | 0.9 |
|---|
| Cost | 1153 |
|---|
\[\begin{array}{l}
\mathbf{if}\;a \cdot x \leq -112941.26366565312:\\
\;\;\;\;-1\\
\mathbf{else}:\\
\;\;\;\;a \cdot \left(x + 0.5 \cdot \left(x \cdot \left(a \cdot x\right)\right)\right)\\
\end{array}\]
| Alternative 8 |
|---|
| Error | 1.2 |
|---|
| Cost | 641 |
|---|
\[\begin{array}{l}
\mathbf{if}\;a \cdot x \leq -1.1071065083608937:\\
\;\;\;\;-1\\
\mathbf{else}:\\
\;\;\;\;a \cdot x\\
\end{array}\]
| Alternative 9 |
|---|
| Error | 34.5 |
|---|
| Cost | 706 |
|---|
\[\begin{array}{l}
\mathbf{if}\;a \leq -3.1034993266129114 \cdot 10^{-153}:\\
\;\;\;\;-1\\
\mathbf{elif}\;a \leq 5.735578023165714 \cdot 10^{-118}:\\
\;\;\;\;0\\
\mathbf{else}:\\
\;\;\;\;-1\\
\end{array}\]
| Alternative 10 |
|---|
| Error | 41.3 |
|---|
| Cost | 64 |
|---|
\[-1\]
Error

Derivation
- Split input into 2 regimes
if (*.f64 a x) < -0.0020509167217338674
Initial program 0.0
\[e^{a \cdot x} - 1\]
- Using strategy
rm Applied flip--_binary64_14170.0
\[\leadsto \color{blue}{\frac{e^{a \cdot x} \cdot e^{a \cdot x} - 1 \cdot 1}{e^{a \cdot x} + 1}}\]
Simplified0.0
\[\leadsto \frac{\color{blue}{{\left(e^{a \cdot x}\right)}^{2} + -1}}{e^{a \cdot x} + 1}\]
- Using strategy
rm Applied add-log-exp_binary64_14810.0
\[\leadsto \frac{{\left(e^{a \cdot x}\right)}^{2} + \color{blue}{\log \left(e^{-1}\right)}}{e^{a \cdot x} + 1}\]
Applied add-log-exp_binary64_14810.0
\[\leadsto \frac{\color{blue}{\log \left(e^{{\left(e^{a \cdot x}\right)}^{2}}\right)} + \log \left(e^{-1}\right)}{e^{a \cdot x} + 1}\]
Applied sum-log_binary64_15330.0
\[\leadsto \frac{\color{blue}{\log \left(e^{{\left(e^{a \cdot x}\right)}^{2}} \cdot e^{-1}\right)}}{e^{a \cdot x} + 1}\]
Simplified0.0
\[\leadsto \frac{\log \color{blue}{\left(e^{{\left(e^{a \cdot x}\right)}^{2} + -1}\right)}}{e^{a \cdot x} + 1}\]
Simplified0.0
\[\leadsto \color{blue}{\frac{\log \left(e^{{\left(e^{a \cdot x}\right)}^{2} + -1}\right)}{e^{a \cdot x} + 1}}\]
if -0.0020509167217338674 < (*.f64 a x)
Initial program 44.2
\[e^{a \cdot x} - 1\]
- Using strategy
rm Applied pow1_binary64_150344.2
\[\leadsto \color{blue}{{\left(e^{a \cdot x} - 1\right)}^{1}}\]
Taylor expanded around 0 18.0
\[\leadsto {\color{blue}{\left(a \cdot x + \left(0.16666666666666666 \cdot \left({a}^{3} \cdot {x}^{3}\right) + \left(0.5 \cdot \left({a}^{2} \cdot {x}^{2}\right) + 0.041666666666666664 \cdot \left({a}^{4} \cdot {x}^{4}\right)\right)\right)\right)}}^{1}\]
Simplified0.4
\[\leadsto {\color{blue}{\left(a \cdot x + \left(0.16666666666666666 \cdot {\left(a \cdot x\right)}^{3} + \left(0.5 \cdot {\left(a \cdot x\right)}^{2} + 0.041666666666666664 \cdot {\left(a \cdot x\right)}^{4}\right)\right)\right)}}^{1}\]
Taylor expanded around 0 18.0
\[\leadsto {\left(a \cdot x + \color{blue}{\left(0.16666666666666666 \cdot \left({a}^{3} \cdot {x}^{3}\right) + \left(0.041666666666666664 \cdot \left({a}^{4} \cdot {x}^{4}\right) + 0.5 \cdot \left({a}^{2} \cdot {x}^{2}\right)\right)\right)}\right)}^{1}\]
Simplified0.4
\[\leadsto {\left(a \cdot x + \color{blue}{\left(0.041666666666666664 \cdot {\left(a \cdot x\right)}^{4} + {\left(a \cdot x\right)}^{2} \cdot \left(0.16666666666666666 \cdot \left(a \cdot x\right) + 0.5\right)\right)}\right)}^{1}\]
Simplified0.4
\[\leadsto \color{blue}{a \cdot x + \left({\left(a \cdot x\right)}^{4} \cdot 0.041666666666666664 + {\left(a \cdot x\right)}^{2} \cdot \left(0.5 + \left(a \cdot x\right) \cdot 0.16666666666666666\right)\right)}\]
- Recombined 2 regimes into one program.
Final simplification0.3
\[\leadsto \begin{array}{l}
\mathbf{if}\;a \cdot x \leq -0.0020509167217338674:\\
\;\;\;\;\frac{\log \left(e^{{\left(e^{a \cdot x}\right)}^{2} + -1}\right)}{e^{a \cdot x} + 1}\\
\mathbf{else}:\\
\;\;\;\;a \cdot x + \left({\left(a \cdot x\right)}^{4} \cdot 0.041666666666666664 + {\left(a \cdot x\right)}^{2} \cdot \left(0.5 + \left(a \cdot x\right) \cdot 0.16666666666666666\right)\right)\\
\end{array}\]
Reproduce
herbie shell --seed 2021014
(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))