Average Error: 29.7 → 9.8
Time: 3.3s
Precision: 64
\[e^{a \cdot x} - 1\]
\[\begin{array}{l} \mathbf{if}\;a \cdot x \le -6.883670130696454110254072018681462839622 \cdot 10^{-19} \lor \neg \left(a \cdot x \le 5.145272381710981521082629097103889956475 \cdot 10^{-33}\right):\\ \;\;\;\;\mathsf{fma}\left(\sqrt{\left(\left(\sqrt[3]{1} \cdot e^{\frac{1}{3} \cdot \left(a \cdot x\right)}\right) \cdot \sqrt[3]{e^{a \cdot x}}\right) \cdot \sqrt[3]{e^{a \cdot x}}}, e^{\frac{1}{2} \cdot \left(a \cdot x\right)}, -1\right)\\ \mathbf{else}:\\ \;\;\;\;\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)\\ \end{array}\]
e^{a \cdot x} - 1
\begin{array}{l}
\mathbf{if}\;a \cdot x \le -6.883670130696454110254072018681462839622 \cdot 10^{-19} \lor \neg \left(a \cdot x \le 5.145272381710981521082629097103889956475 \cdot 10^{-33}\right):\\
\;\;\;\;\mathsf{fma}\left(\sqrt{\left(\left(\sqrt[3]{1} \cdot e^{\frac{1}{3} \cdot \left(a \cdot x\right)}\right) \cdot \sqrt[3]{e^{a \cdot x}}\right) \cdot \sqrt[3]{e^{a \cdot x}}}, e^{\frac{1}{2} \cdot \left(a \cdot x\right)}, -1\right)\\

\mathbf{else}:\\
\;\;\;\;\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)\\

\end{array}
double f(double a, double x) {
        double r108735 = a;
        double r108736 = x;
        double r108737 = r108735 * r108736;
        double r108738 = exp(r108737);
        double r108739 = 1.0;
        double r108740 = r108738 - r108739;
        return r108740;
}

double f(double a, double x) {
        double r108741 = a;
        double r108742 = x;
        double r108743 = r108741 * r108742;
        double r108744 = -6.883670130696454e-19;
        bool r108745 = r108743 <= r108744;
        double r108746 = 5.1452723817109815e-33;
        bool r108747 = r108743 <= r108746;
        double r108748 = !r108747;
        bool r108749 = r108745 || r108748;
        double r108750 = 1.0;
        double r108751 = cbrt(r108750);
        double r108752 = 0.3333333333333333;
        double r108753 = r108752 * r108743;
        double r108754 = exp(r108753);
        double r108755 = r108751 * r108754;
        double r108756 = exp(r108743);
        double r108757 = cbrt(r108756);
        double r108758 = r108755 * r108757;
        double r108759 = r108758 * r108757;
        double r108760 = sqrt(r108759);
        double r108761 = 0.5;
        double r108762 = r108761 * r108743;
        double r108763 = exp(r108762);
        double r108764 = 1.0;
        double r108765 = -r108764;
        double r108766 = fma(r108760, r108763, r108765);
        double r108767 = 2.0;
        double r108768 = pow(r108741, r108767);
        double r108769 = pow(r108742, r108767);
        double r108770 = r108768 * r108769;
        double r108771 = 0.16666666666666666;
        double r108772 = 3.0;
        double r108773 = pow(r108741, r108772);
        double r108774 = pow(r108742, r108772);
        double r108775 = r108773 * r108774;
        double r108776 = fma(r108771, r108775, r108743);
        double r108777 = fma(r108761, r108770, r108776);
        double r108778 = r108749 ? r108766 : r108777;
        return r108778;
}

Error

Bits error versus a

Bits error versus x

Target

Original29.7
Target0.2
Herbie9.8
\[\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.883670130696454e-19 or 5.1452723817109815e-33 < (* a x)

    1. Initial program 5.2

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

      \[\leadsto \color{blue}{\sqrt{e^{a \cdot x}} \cdot \sqrt{e^{a \cdot x}}} - 1\]
    4. Applied fma-neg5.3

      \[\leadsto \color{blue}{\mathsf{fma}\left(\sqrt{e^{a \cdot x}}, \sqrt{e^{a \cdot x}}, -1\right)}\]
    5. Using strategy rm
    6. Applied add-exp-log5.3

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

      \[\leadsto \mathsf{fma}\left(\sqrt{e^{a \cdot x}}, e^{\color{blue}{\frac{1}{2} \cdot \left(a \cdot x\right)}}, -1\right)\]
    8. Using strategy rm
    9. Applied add-cube-cbrt5.4

      \[\leadsto \mathsf{fma}\left(\sqrt{\color{blue}{\left(\sqrt[3]{e^{a \cdot x}} \cdot \sqrt[3]{e^{a \cdot x}}\right) \cdot \sqrt[3]{e^{a \cdot x}}}}, e^{\frac{1}{2} \cdot \left(a \cdot x\right)}, -1\right)\]
    10. Using strategy rm
    11. Applied *-un-lft-identity5.4

      \[\leadsto \mathsf{fma}\left(\sqrt{\left(\sqrt[3]{\color{blue}{1 \cdot e^{a \cdot x}}} \cdot \sqrt[3]{e^{a \cdot x}}\right) \cdot \sqrt[3]{e^{a \cdot x}}}, e^{\frac{1}{2} \cdot \left(a \cdot x\right)}, -1\right)\]
    12. Applied cbrt-prod5.4

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

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

    if -6.883670130696454e-19 < (* a x) < 5.1452723817109815e-33

    1. Initial program 45.3

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

      \[\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. Simplified12.6

      \[\leadsto \color{blue}{\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)}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification9.8

    \[\leadsto \begin{array}{l} \mathbf{if}\;a \cdot x \le -6.883670130696454110254072018681462839622 \cdot 10^{-19} \lor \neg \left(a \cdot x \le 5.145272381710981521082629097103889956475 \cdot 10^{-33}\right):\\ \;\;\;\;\mathsf{fma}\left(\sqrt{\left(\left(\sqrt[3]{1} \cdot e^{\frac{1}{3} \cdot \left(a \cdot x\right)}\right) \cdot \sqrt[3]{e^{a \cdot x}}\right) \cdot \sqrt[3]{e^{a \cdot x}}}, e^{\frac{1}{2} \cdot \left(a \cdot x\right)}, -1\right)\\ \mathbf{else}:\\ \;\;\;\;\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)\\ \end{array}\]

Reproduce

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