e^{a \cdot x} - 1\begin{array}{l}
\mathbf{if}\;a \cdot x \le -7.7613608644350317 \cdot 10^{-23}:\\
\;\;\;\;\sqrt[3]{\left(\sqrt[3]{{\left(e^{a \cdot x}\right)}^{3}} - 1\right) \cdot {\left(\left(\sqrt{1} + \sqrt{e^{a \cdot x}}\right) \cdot \left(\sqrt{e^{a \cdot x}} - \sqrt{1}\right)\right)}^{2}}\\
\mathbf{elif}\;a \cdot x \le 4.00137271357986445 \cdot 10^{-17}:\\
\;\;\;\;\mathsf{fma}\left(\frac{1}{2}, {a}^{2} \cdot {x}^{2}, \mathsf{fma}\left(\frac{1}{6}, {a}^{3} \cdot {x}^{3}, a \cdot x\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\sqrt[3]{\mathsf{fma}\left(\sqrt[3]{\sqrt[3]{{\left(e^{a \cdot x}\right)}^{3}} \cdot \sqrt[3]{{\left(e^{a \cdot x}\right)}^{3}}}, \sqrt[3]{\sqrt[3]{{\left(e^{a \cdot x}\right)}^{3}}}, -1\right) \cdot {\left(e^{a \cdot x} - 1\right)}^{2}}\\
\end{array}double f(double a, double x) {
double r95513 = a;
double r95514 = x;
double r95515 = r95513 * r95514;
double r95516 = exp(r95515);
double r95517 = 1.0;
double r95518 = r95516 - r95517;
return r95518;
}
double f(double a, double x) {
double r95519 = a;
double r95520 = x;
double r95521 = r95519 * r95520;
double r95522 = -7.761360864435032e-23;
bool r95523 = r95521 <= r95522;
double r95524 = exp(r95521);
double r95525 = 3.0;
double r95526 = pow(r95524, r95525);
double r95527 = cbrt(r95526);
double r95528 = 1.0;
double r95529 = r95527 - r95528;
double r95530 = sqrt(r95528);
double r95531 = sqrt(r95524);
double r95532 = r95530 + r95531;
double r95533 = r95531 - r95530;
double r95534 = r95532 * r95533;
double r95535 = 2.0;
double r95536 = pow(r95534, r95535);
double r95537 = r95529 * r95536;
double r95538 = cbrt(r95537);
double r95539 = 4.0013727135798645e-17;
bool r95540 = r95521 <= r95539;
double r95541 = 0.5;
double r95542 = pow(r95519, r95535);
double r95543 = pow(r95520, r95535);
double r95544 = r95542 * r95543;
double r95545 = 0.16666666666666666;
double r95546 = pow(r95519, r95525);
double r95547 = pow(r95520, r95525);
double r95548 = r95546 * r95547;
double r95549 = fma(r95545, r95548, r95521);
double r95550 = fma(r95541, r95544, r95549);
double r95551 = r95527 * r95527;
double r95552 = cbrt(r95551);
double r95553 = cbrt(r95527);
double r95554 = -r95528;
double r95555 = fma(r95552, r95553, r95554);
double r95556 = r95524 - r95528;
double r95557 = pow(r95556, r95535);
double r95558 = r95555 * r95557;
double r95559 = cbrt(r95558);
double r95560 = r95540 ? r95550 : r95559;
double r95561 = r95523 ? r95538 : r95560;
return r95561;
}




Bits error versus a




Bits error versus x
| Original | 29.8 |
|---|---|
| Target | 0.2 |
| Herbie | 8.9 |
if (* a x) < -7.761360864435032e-23Initial program 2.1
rmApplied add-cbrt-cube2.1
Simplified2.1
rmApplied cube-mult2.1
Simplified2.1
rmApplied add-cbrt-cube2.1
Simplified2.1
rmApplied add-sqr-sqrt2.1
Applied add-sqr-sqrt2.1
Applied difference-of-squares2.1
Simplified2.1
if -7.761360864435032e-23 < (* a x) < 4.0013727135798645e-17Initial program 45.6
Taylor expanded around 0 12.2
Simplified12.2
if 4.0013727135798645e-17 < (* a x) Initial program 22.5
rmApplied add-cbrt-cube25.2
Simplified25.2
rmApplied cube-mult25.2
Simplified25.2
rmApplied add-cbrt-cube25.6
Simplified25.5
rmApplied add-cube-cbrt25.6
Applied cbrt-prod25.7
Applied fma-neg25.6
Final simplification8.9
herbie shell --seed 2020021 +o rules:numerics
(FPCore (a x)
:name "expax (section 3.5)"
:precision binary64
:herbie-expected 14
:herbie-target
(if (< (fabs (* a x)) 0.1) (* (* a x) (+ 1 (+ (/ (* a x) 2) (/ (pow (* a x) 2) 6)))) (- (exp (* a x)) 1))
(- (exp (* a x)) 1))