Average Error: 29.8 → 3.4
Time: 16.7s
Precision: 64
\[e^{a \cdot x} - 1\]
\[\begin{array}{l} \mathbf{if}\;a \cdot x \le -3.7825639584990174123449858771539577873 \cdot 10^{-7}:\\ \;\;\;\;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(x \cdot \frac{1}{6}\right)\right) \cdot x\right)}\right)\right)\\ \end{array}\]
e^{a \cdot x} - 1
\begin{array}{l}
\mathbf{if}\;a \cdot x \le -3.7825639584990174123449858771539577873 \cdot 10^{-7}:\\
\;\;\;\;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(x \cdot \frac{1}{6}\right)\right) \cdot x\right)}\right)\right)\\

\end{array}
double f(double a, double x) {
        double r91651 = a;
        double r91652 = x;
        double r91653 = r91651 * r91652;
        double r91654 = exp(r91653);
        double r91655 = 1.0;
        double r91656 = r91654 - r91655;
        return r91656;
}

double f(double a, double x) {
        double r91657 = a;
        double r91658 = x;
        double r91659 = r91657 * r91658;
        double r91660 = -3.7825639584990174e-07;
        bool r91661 = r91659 <= r91660;
        double r91662 = exp(r91659);
        double r91663 = 1.0;
        double r91664 = r91662 - r91663;
        double r91665 = exp(r91658);
        double r91666 = r91657 * r91657;
        double r91667 = 0.5;
        double r91668 = 3.0;
        double r91669 = pow(r91657, r91668);
        double r91670 = 0.16666666666666666;
        double r91671 = r91658 * r91670;
        double r91672 = r91669 * r91671;
        double r91673 = fma(r91666, r91667, r91672);
        double r91674 = r91673 * r91658;
        double r91675 = pow(r91665, r91674);
        double r91676 = log(r91675);
        double r91677 = fma(r91657, r91658, r91676);
        double r91678 = r91661 ? r91664 : r91677;
        return r91678;
}

Error

Bits error versus a

Bits error versus x

Target

Original29.8
Target0.1
Herbie3.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) < -3.7825639584990174e-07

    1. Initial program 0.1

      \[e^{a \cdot x} - 1\]

    if -3.7825639584990174e-07 < (* a x)

    1. Initial program 44.9

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

      \[\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. Simplified11.8

      \[\leadsto \color{blue}{\mathsf{fma}\left(a, x, \left(x \cdot x\right) \cdot \mathsf{fma}\left(\frac{1}{2}, a \cdot a, \frac{1}{6} \cdot \left({a}^{3} \cdot x\right)\right)\right)}\]
    4. Using strategy rm
    5. Applied add-log-exp12.0

      \[\leadsto \mathsf{fma}\left(a, x, \color{blue}{\log \left(e^{\left(x \cdot x\right) \cdot \mathsf{fma}\left(\frac{1}{2}, a \cdot a, \frac{1}{6} \cdot \left({a}^{3} \cdot x\right)\right)}\right)}\right)\]
    6. Simplified5.1

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

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

Reproduce

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