Average Error: 29.7 → 0.4
Time: 23.7s
Precision: 64
\[e^{a \cdot x} - 1\]
\[\begin{array}{l} \mathbf{if}\;a \cdot x \le -0.01978988839323105736189845060835068579763:\\ \;\;\;\;\sqrt[3]{e^{x \cdot \mathsf{fma}\left(2, a, a\right)}} - 1\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(\left(a \cdot x\right) \cdot \left(a \cdot x\right), \mathsf{fma}\left(\frac{1}{6}, a \cdot x, \frac{1}{2}\right), a \cdot x\right)\\ \end{array}\]
e^{a \cdot x} - 1
\begin{array}{l}
\mathbf{if}\;a \cdot x \le -0.01978988839323105736189845060835068579763:\\
\;\;\;\;\sqrt[3]{e^{x \cdot \mathsf{fma}\left(2, a, a\right)}} - 1\\

\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\left(a \cdot x\right) \cdot \left(a \cdot x\right), \mathsf{fma}\left(\frac{1}{6}, a \cdot x, \frac{1}{2}\right), a \cdot x\right)\\

\end{array}
double f(double a, double x) {
        double r8374591 = a;
        double r8374592 = x;
        double r8374593 = r8374591 * r8374592;
        double r8374594 = exp(r8374593);
        double r8374595 = 1.0;
        double r8374596 = r8374594 - r8374595;
        return r8374596;
}

double f(double a, double x) {
        double r8374597 = a;
        double r8374598 = x;
        double r8374599 = r8374597 * r8374598;
        double r8374600 = -0.019789888393231057;
        bool r8374601 = r8374599 <= r8374600;
        double r8374602 = 2.0;
        double r8374603 = fma(r8374602, r8374597, r8374597);
        double r8374604 = r8374598 * r8374603;
        double r8374605 = exp(r8374604);
        double r8374606 = cbrt(r8374605);
        double r8374607 = 1.0;
        double r8374608 = r8374606 - r8374607;
        double r8374609 = r8374599 * r8374599;
        double r8374610 = 0.16666666666666666;
        double r8374611 = 0.5;
        double r8374612 = fma(r8374610, r8374599, r8374611);
        double r8374613 = fma(r8374609, r8374612, r8374599);
        double r8374614 = r8374601 ? r8374608 : r8374613;
        return r8374614;
}

Error

Bits error versus a

Bits error versus x

Target

Original29.7
Target0.1
Herbie0.4
\[\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) < -0.019789888393231057

    1. Initial program 0.0

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

      \[\leadsto \color{blue}{\sqrt[3]{\left(e^{a \cdot x} \cdot e^{a \cdot x}\right) \cdot e^{a \cdot x}}} - 1\]
    4. Simplified0.0

      \[\leadsto \sqrt[3]{\color{blue}{e^{x \cdot \mathsf{fma}\left(2, a, a\right)}}} - 1\]

    if -0.019789888393231057 < (* a x)

    1. Initial program 44.0

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

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

      \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{1}{6}, \left(a \cdot x\right) \cdot \left(\left(a \cdot x\right) \cdot \left(a \cdot x\right)\right), \mathsf{fma}\left(\frac{1}{2}, \left(a \cdot x\right) \cdot \left(a \cdot x\right), a \cdot x\right)\right)}\]
    4. Taylor expanded around inf 15.1

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

      \[\leadsto \color{blue}{\mathsf{fma}\left(\left(a \cdot x\right) \cdot \left(a \cdot x\right), \mathsf{fma}\left(\frac{1}{6}, a \cdot x, \frac{1}{2}\right), a \cdot x\right)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.4

    \[\leadsto \begin{array}{l} \mathbf{if}\;a \cdot x \le -0.01978988839323105736189845060835068579763:\\ \;\;\;\;\sqrt[3]{e^{x \cdot \mathsf{fma}\left(2, a, a\right)}} - 1\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(\left(a \cdot x\right) \cdot \left(a \cdot x\right), \mathsf{fma}\left(\frac{1}{6}, a \cdot x, \frac{1}{2}\right), a \cdot x\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2019173 +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))