Average Error: 29.5 → 3.0
Time: 10.1s
Precision: 64
\[e^{a \cdot x} - 1\]
\[\begin{array}{l} \mathbf{if}\;a \cdot x \le -6.158968166252154678263867892962224459552 \cdot 10^{-6}:\\ \;\;\;\;\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}:\\ \;\;\;\;a \cdot \left(a \cdot \left({x}^{2} \cdot \left(\frac{1}{2} + x \cdot \left(\frac{1}{6} \cdot a\right)\right)\right) + x\right)\\ \end{array}\]
e^{a \cdot x} - 1
\begin{array}{l}
\mathbf{if}\;a \cdot x \le -6.158968166252154678263867892962224459552 \cdot 10^{-6}:\\
\;\;\;\;\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}:\\
\;\;\;\;a \cdot \left(a \cdot \left({x}^{2} \cdot \left(\frac{1}{2} + x \cdot \left(\frac{1}{6} \cdot a\right)\right)\right) + x\right)\\

\end{array}
double f(double a, double x) {
        double r118618 = a;
        double r118619 = x;
        double r118620 = r118618 * r118619;
        double r118621 = exp(r118620);
        double r118622 = 1.0;
        double r118623 = r118621 - r118622;
        return r118623;
}

double f(double a, double x) {
        double r118624 = a;
        double r118625 = x;
        double r118626 = r118624 * r118625;
        double r118627 = -6.158968166252155e-06;
        bool r118628 = r118626 <= r118627;
        double r118629 = exp(r118626);
        double r118630 = 1.0;
        double r118631 = r118629 - r118630;
        double r118632 = cbrt(r118631);
        double r118633 = r118632 * r118632;
        double r118634 = r118633 * r118632;
        double r118635 = 2.0;
        double r118636 = pow(r118625, r118635);
        double r118637 = 0.5;
        double r118638 = 0.16666666666666666;
        double r118639 = r118638 * r118624;
        double r118640 = r118625 * r118639;
        double r118641 = r118637 + r118640;
        double r118642 = r118636 * r118641;
        double r118643 = r118624 * r118642;
        double r118644 = r118643 + r118625;
        double r118645 = r118624 * r118644;
        double r118646 = r118628 ? r118634 : r118645;
        return r118646;
}

Error

Bits error versus a

Bits error versus x

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original29.5
Target0.1
Herbie3.0
\[\begin{array}{l} \mathbf{if}\;\left|a \cdot x\right| \lt 0.1000000000000000055511151231257827021182:\\ \;\;\;\;\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}\]

Derivation

  1. Split input into 2 regimes
  2. if (* a x) < -6.158968166252155e-06

    1. Initial program 0.1

      \[e^{a \cdot x} - 1\]
    2. Using strategy rm
    3. Applied add-cube-cbrt0.1

      \[\leadsto \color{blue}{\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}}\]

    if -6.158968166252155e-06 < (* a x)

    1. Initial program 44.7

      \[e^{a \cdot x} - 1\]
    2. Taylor expanded around 0 14.8

      \[\leadsto \color{blue}{\frac{1}{2} \cdot \left({a}^{2} \cdot {x}^{2}\right) + \left(\frac{1}{6} \cdot \left({a}^{3} \cdot {x}^{3}\right) + a \cdot x\right)}\]
    3. Simplified4.5

      \[\leadsto \color{blue}{a \cdot \left(a \cdot \left({x}^{2} \cdot \left(\frac{1}{2} + x \cdot \left(\frac{1}{6} \cdot a\right)\right)\right) + x\right)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification3.0

    \[\leadsto \begin{array}{l} \mathbf{if}\;a \cdot x \le -6.158968166252154678263867892962224459552 \cdot 10^{-6}:\\ \;\;\;\;\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}:\\ \;\;\;\;a \cdot \left(a \cdot \left({x}^{2} \cdot \left(\frac{1}{2} + x \cdot \left(\frac{1}{6} \cdot a\right)\right)\right) + x\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2019351 
(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))