Average Error: 29.4 → 1.1
Time: 6.5s
Precision: 64
\[\frac{\left(1 + \frac{1}{\varepsilon}\right) \cdot e^{-\left(1 - \varepsilon\right) \cdot x} - \left(\frac{1}{\varepsilon} - 1\right) \cdot e^{-\left(1 + \varepsilon\right) \cdot x}}{2}\]
\[\begin{array}{l} \mathbf{if}\;x \le 1.3945538910343576:\\ \;\;\;\;1 - 0.5 \cdot {x}^{2}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(\frac{e^{-\left(1 + \varepsilon\right) \cdot x}}{2}, 1 - \frac{1}{\varepsilon}, \frac{1 + \frac{1}{\varepsilon}}{2 \cdot \left(\left(\sqrt[3]{e^{\left(1 - \varepsilon\right) \cdot x}} \cdot \sqrt[3]{e^{\left(1 - \varepsilon\right) \cdot x}}\right) \cdot \sqrt[3]{e^{\left(1 - \varepsilon\right) \cdot x}}\right)}\right)\\ \end{array}\]
\frac{\left(1 + \frac{1}{\varepsilon}\right) \cdot e^{-\left(1 - \varepsilon\right) \cdot x} - \left(\frac{1}{\varepsilon} - 1\right) \cdot e^{-\left(1 + \varepsilon\right) \cdot x}}{2}
\begin{array}{l}
\mathbf{if}\;x \le 1.3945538910343576:\\
\;\;\;\;1 - 0.5 \cdot {x}^{2}\\

\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{e^{-\left(1 + \varepsilon\right) \cdot x}}{2}, 1 - \frac{1}{\varepsilon}, \frac{1 + \frac{1}{\varepsilon}}{2 \cdot \left(\left(\sqrt[3]{e^{\left(1 - \varepsilon\right) \cdot x}} \cdot \sqrt[3]{e^{\left(1 - \varepsilon\right) \cdot x}}\right) \cdot \sqrt[3]{e^{\left(1 - \varepsilon\right) \cdot x}}\right)}\right)\\

\end{array}
double f(double x, double eps) {
        double r42487 = 1.0;
        double r42488 = eps;
        double r42489 = r42487 / r42488;
        double r42490 = r42487 + r42489;
        double r42491 = r42487 - r42488;
        double r42492 = x;
        double r42493 = r42491 * r42492;
        double r42494 = -r42493;
        double r42495 = exp(r42494);
        double r42496 = r42490 * r42495;
        double r42497 = r42489 - r42487;
        double r42498 = r42487 + r42488;
        double r42499 = r42498 * r42492;
        double r42500 = -r42499;
        double r42501 = exp(r42500);
        double r42502 = r42497 * r42501;
        double r42503 = r42496 - r42502;
        double r42504 = 2.0;
        double r42505 = r42503 / r42504;
        return r42505;
}

double f(double x, double eps) {
        double r42506 = x;
        double r42507 = 1.3945538910343576;
        bool r42508 = r42506 <= r42507;
        double r42509 = 1.0;
        double r42510 = 0.5;
        double r42511 = 2.0;
        double r42512 = pow(r42506, r42511);
        double r42513 = r42510 * r42512;
        double r42514 = r42509 - r42513;
        double r42515 = eps;
        double r42516 = r42509 + r42515;
        double r42517 = r42516 * r42506;
        double r42518 = -r42517;
        double r42519 = exp(r42518);
        double r42520 = 2.0;
        double r42521 = r42519 / r42520;
        double r42522 = r42509 / r42515;
        double r42523 = r42509 - r42522;
        double r42524 = r42509 + r42522;
        double r42525 = r42509 - r42515;
        double r42526 = r42525 * r42506;
        double r42527 = exp(r42526);
        double r42528 = cbrt(r42527);
        double r42529 = r42528 * r42528;
        double r42530 = r42529 * r42528;
        double r42531 = r42520 * r42530;
        double r42532 = r42524 / r42531;
        double r42533 = fma(r42521, r42523, r42532);
        double r42534 = r42508 ? r42514 : r42533;
        return r42534;
}

Error

Bits error versus x

Bits error versus eps

Derivation

  1. Split input into 2 regimes
  2. if x < 1.3945538910343576

    1. Initial program 39.4

      \[\frac{\left(1 + \frac{1}{\varepsilon}\right) \cdot e^{-\left(1 - \varepsilon\right) \cdot x} - \left(\frac{1}{\varepsilon} - 1\right) \cdot e^{-\left(1 + \varepsilon\right) \cdot x}}{2}\]
    2. Simplified39.4

      \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{e^{-\left(1 + \varepsilon\right) \cdot x}}{2}, 1 - \frac{1}{\varepsilon}, \frac{1 + \frac{1}{\varepsilon}}{2 \cdot e^{\left(1 - \varepsilon\right) \cdot x}}\right)}\]
    3. Taylor expanded around 0 7.8

      \[\leadsto \color{blue}{\left(1.38778 \cdot 10^{-17} \cdot \frac{{x}^{3}}{\varepsilon} + 1\right) - 0.5 \cdot {x}^{2}}\]
    4. Simplified7.8

      \[\leadsto \color{blue}{\mathsf{fma}\left(1.38778 \cdot 10^{-17}, \frac{{x}^{3}}{\varepsilon}, 1 - 0.5 \cdot {x}^{2}\right)}\]
    5. Using strategy rm
    6. Applied expm1-log1p-u7.8

      \[\leadsto \color{blue}{\mathsf{expm1}\left(\mathsf{log1p}\left(\mathsf{fma}\left(1.38778 \cdot 10^{-17}, \frac{{x}^{3}}{\varepsilon}, 1 - 0.5 \cdot {x}^{2}\right)\right)\right)}\]
    7. Taylor expanded around 0 1.3

      \[\leadsto \color{blue}{1 - 0.5 \cdot {x}^{2}}\]

    if 1.3945538910343576 < x

    1. Initial program 0.4

      \[\frac{\left(1 + \frac{1}{\varepsilon}\right) \cdot e^{-\left(1 - \varepsilon\right) \cdot x} - \left(\frac{1}{\varepsilon} - 1\right) \cdot e^{-\left(1 + \varepsilon\right) \cdot x}}{2}\]
    2. Simplified0.4

      \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{e^{-\left(1 + \varepsilon\right) \cdot x}}{2}, 1 - \frac{1}{\varepsilon}, \frac{1 + \frac{1}{\varepsilon}}{2 \cdot e^{\left(1 - \varepsilon\right) \cdot x}}\right)}\]
    3. Using strategy rm
    4. Applied add-cube-cbrt0.4

      \[\leadsto \mathsf{fma}\left(\frac{e^{-\left(1 + \varepsilon\right) \cdot x}}{2}, 1 - \frac{1}{\varepsilon}, \frac{1 + \frac{1}{\varepsilon}}{2 \cdot \color{blue}{\left(\left(\sqrt[3]{e^{\left(1 - \varepsilon\right) \cdot x}} \cdot \sqrt[3]{e^{\left(1 - \varepsilon\right) \cdot x}}\right) \cdot \sqrt[3]{e^{\left(1 - \varepsilon\right) \cdot x}}\right)}}\right)\]
  3. Recombined 2 regimes into one program.
  4. Final simplification1.1

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

Reproduce

herbie shell --seed 2020025 +o rules:numerics
(FPCore (x eps)
  :name "NMSE Section 6.1 mentioned, A"
  :precision binary64
  (/ (- (* (+ 1 (/ 1 eps)) (exp (- (* (- 1 eps) x)))) (* (- (/ 1 eps) 1) (exp (- (* (+ 1 eps) x))))) 2))