Average Error: 29.8 → 3.1
Time: 18.7s
Precision: 64
\[e^{a \cdot x} - 1\]
\[\begin{array}{l} \mathbf{if}\;a \cdot x \le -8.829291748098453965699783086839461538272 \cdot 10^{-15}:\\ \;\;\;\;\frac{\frac{e^{\left(a \cdot x\right) \cdot 4} - {1}^{4}}{\mathsf{fma}\left(1, 1, e^{2 \cdot \left(a \cdot x\right)}\right)}}{e^{a \cdot x} + 1}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{log1p}\left(\mathsf{expm1}\left(x \cdot \left(a + \left(\left(a \cdot a\right) \cdot \left(\left(x \cdot \frac{1}{6}\right) \cdot a + \frac{1}{2}\right)\right) \cdot x\right)\right)\right)\\ \end{array}\]
e^{a \cdot x} - 1
\begin{array}{l}
\mathbf{if}\;a \cdot x \le -8.829291748098453965699783086839461538272 \cdot 10^{-15}:\\
\;\;\;\;\frac{\frac{e^{\left(a \cdot x\right) \cdot 4} - {1}^{4}}{\mathsf{fma}\left(1, 1, e^{2 \cdot \left(a \cdot x\right)}\right)}}{e^{a \cdot x} + 1}\\

\mathbf{else}:\\
\;\;\;\;\mathsf{log1p}\left(\mathsf{expm1}\left(x \cdot \left(a + \left(\left(a \cdot a\right) \cdot \left(\left(x \cdot \frac{1}{6}\right) \cdot a + \frac{1}{2}\right)\right) \cdot x\right)\right)\right)\\

\end{array}
double f(double a, double x) {
        double r85499 = a;
        double r85500 = x;
        double r85501 = r85499 * r85500;
        double r85502 = exp(r85501);
        double r85503 = 1.0;
        double r85504 = r85502 - r85503;
        return r85504;
}

double f(double a, double x) {
        double r85505 = a;
        double r85506 = x;
        double r85507 = r85505 * r85506;
        double r85508 = -8.829291748098454e-15;
        bool r85509 = r85507 <= r85508;
        double r85510 = 4.0;
        double r85511 = r85507 * r85510;
        double r85512 = exp(r85511);
        double r85513 = 1.0;
        double r85514 = pow(r85513, r85510);
        double r85515 = r85512 - r85514;
        double r85516 = 2.0;
        double r85517 = r85516 * r85507;
        double r85518 = exp(r85517);
        double r85519 = fma(r85513, r85513, r85518);
        double r85520 = r85515 / r85519;
        double r85521 = exp(r85507);
        double r85522 = r85521 + r85513;
        double r85523 = r85520 / r85522;
        double r85524 = r85505 * r85505;
        double r85525 = 0.16666666666666666;
        double r85526 = r85506 * r85525;
        double r85527 = r85526 * r85505;
        double r85528 = 0.5;
        double r85529 = r85527 + r85528;
        double r85530 = r85524 * r85529;
        double r85531 = r85530 * r85506;
        double r85532 = r85505 + r85531;
        double r85533 = r85506 * r85532;
        double r85534 = expm1(r85533);
        double r85535 = log1p(r85534);
        double r85536 = r85509 ? r85523 : r85535;
        return r85536;
}

Error

Bits error versus a

Bits error versus x

Target

Original29.8
Target0.2
Herbie3.1
\[\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) < -8.829291748098454e-15

    1. Initial program 1.1

      \[e^{a \cdot x} - 1\]
    2. Using strategy rm
    3. Applied flip--1.1

      \[\leadsto \color{blue}{\frac{e^{a \cdot x} \cdot e^{a \cdot x} - 1 \cdot 1}{e^{a \cdot x} + 1}}\]
    4. Simplified1.0

      \[\leadsto \frac{\color{blue}{e^{2 \cdot \left(a \cdot x\right)} - 1 \cdot 1}}{e^{a \cdot x} + 1}\]
    5. Using strategy rm
    6. Applied flip--1.0

      \[\leadsto \frac{\color{blue}{\frac{e^{2 \cdot \left(a \cdot x\right)} \cdot e^{2 \cdot \left(a \cdot x\right)} - \left(1 \cdot 1\right) \cdot \left(1 \cdot 1\right)}{e^{2 \cdot \left(a \cdot x\right)} + 1 \cdot 1}}}{e^{a \cdot x} + 1}\]
    7. Simplified1.0

      \[\leadsto \frac{\frac{\color{blue}{e^{\left(a \cdot x\right) \cdot 4} - {1}^{4}}}{e^{2 \cdot \left(a \cdot x\right)} + 1 \cdot 1}}{e^{a \cdot x} + 1}\]
    8. Simplified1.0

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

    if -8.829291748098454e-15 < (* a x)

    1. Initial program 44.8

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

      \[\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. Simplified10.7

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;a \cdot x \le -8.829291748098453965699783086839461538272 \cdot 10^{-15}:\\ \;\;\;\;\frac{\frac{e^{\left(a \cdot x\right) \cdot 4} - {1}^{4}}{\mathsf{fma}\left(1, 1, e^{2 \cdot \left(a \cdot x\right)}\right)}}{e^{a \cdot x} + 1}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{log1p}\left(\mathsf{expm1}\left(x \cdot \left(a + \left(\left(a \cdot a\right) \cdot \left(\left(x \cdot \frac{1}{6}\right) \cdot a + \frac{1}{2}\right)\right) \cdot x\right)\right)\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2019235 +o rules:numerics
(FPCore (a x)
  :name "expax (section 3.5)"
  :precision binary64
  :herbie-expected 14

  :herbie-target
  (if (< (fabs (* a x)) 0.10000000000000001) (* (* a x) (+ 1 (+ (/ (* a x) 2) (/ (pow (* a x) 2) 6)))) (- (exp (* a x)) 1))

  (- (exp (* a x)) 1))