e^{a \cdot x} - 1\begin{array}{l}
\mathbf{if}\;a \cdot x \le -4.062951262301690436022485283190371518911 \cdot 10^{-21}:\\
\;\;\;\;\left(\sqrt[3]{e^{a \cdot x} - 1} \cdot \sqrt[3]{e^{a \cdot x} - 1}\right) \cdot \sqrt[3]{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(\frac{1}{6} \cdot x\right)\right) \cdot x\right)}\right)\right)\\
\end{array}double f(double a, double x) {
double r75022 = a;
double r75023 = x;
double r75024 = r75022 * r75023;
double r75025 = exp(r75024);
double r75026 = 1.0;
double r75027 = r75025 - r75026;
return r75027;
}
double f(double a, double x) {
double r75028 = a;
double r75029 = x;
double r75030 = r75028 * r75029;
double r75031 = -4.0629512623016904e-21;
bool r75032 = r75030 <= r75031;
double r75033 = exp(r75030);
double r75034 = 1.0;
double r75035 = r75033 - r75034;
double r75036 = cbrt(r75035);
double r75037 = r75036 * r75036;
double r75038 = r75037 * r75036;
double r75039 = exp(r75029);
double r75040 = r75028 * r75028;
double r75041 = 0.5;
double r75042 = 3.0;
double r75043 = pow(r75028, r75042);
double r75044 = 0.16666666666666666;
double r75045 = r75044 * r75029;
double r75046 = r75043 * r75045;
double r75047 = fma(r75040, r75041, r75046);
double r75048 = r75047 * r75029;
double r75049 = pow(r75039, r75048);
double r75050 = log(r75049);
double r75051 = fma(r75028, r75029, r75050);
double r75052 = r75032 ? r75038 : r75051;
return r75052;
}




Bits error versus a




Bits error versus x
| Original | 29.0 |
|---|---|
| Target | 0.2 |
| Herbie | 3.8 |
if (* a x) < -4.0629512623016904e-21Initial program 1.8
rmApplied add-sqr-sqrt1.9
Applied fma-neg1.9
rmApplied add-cube-cbrt1.9
Simplified1.8
Simplified1.8
if -4.0629512623016904e-21 < (* a x) Initial program 44.5
Taylor expanded around 0 13.4
Simplified10.3
rmApplied add-log-exp10.4
Simplified4.9
Final simplification3.8
herbie shell --seed 2019194 +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))