Average Error: 29.5 → 5.3
Time: 7.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 0.892596040930932477:\\ \;\;\;\;\left(\sqrt[3]{\mathsf{fma}\left(1.38778 \cdot 10^{-17}, \frac{{x}^{3}}{\varepsilon}, 1 - 0.5 \cdot {x}^{2}\right)} \cdot \left({1}^{\frac{1}{3}} - 0.166666666666666657 \cdot \left({x}^{2} \cdot {1}^{\frac{1}{3}}\right)\right)\right) \cdot \sqrt[3]{\mathsf{fma}\left(1.38778 \cdot 10^{-17}, \frac{{x}^{3}}{\varepsilon}, 1 - 0.5 \cdot {x}^{2}\right)}\\ \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 e^{\left(1 - \varepsilon\right) \cdot x}}\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 0.892596040930932477:\\
\;\;\;\;\left(\sqrt[3]{\mathsf{fma}\left(1.38778 \cdot 10^{-17}, \frac{{x}^{3}}{\varepsilon}, 1 - 0.5 \cdot {x}^{2}\right)} \cdot \left({1}^{\frac{1}{3}} - 0.166666666666666657 \cdot \left({x}^{2} \cdot {1}^{\frac{1}{3}}\right)\right)\right) \cdot \sqrt[3]{\mathsf{fma}\left(1.38778 \cdot 10^{-17}, \frac{{x}^{3}}{\varepsilon}, 1 - 0.5 \cdot {x}^{2}\right)}\\

\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 e^{\left(1 - \varepsilon\right) \cdot x}}\right)\\

\end{array}
double f(double x, double eps) {
        double r66506 = 1.0;
        double r66507 = eps;
        double r66508 = r66506 / r66507;
        double r66509 = r66506 + r66508;
        double r66510 = r66506 - r66507;
        double r66511 = x;
        double r66512 = r66510 * r66511;
        double r66513 = -r66512;
        double r66514 = exp(r66513);
        double r66515 = r66509 * r66514;
        double r66516 = r66508 - r66506;
        double r66517 = r66506 + r66507;
        double r66518 = r66517 * r66511;
        double r66519 = -r66518;
        double r66520 = exp(r66519);
        double r66521 = r66516 * r66520;
        double r66522 = r66515 - r66521;
        double r66523 = 2.0;
        double r66524 = r66522 / r66523;
        return r66524;
}

double f(double x, double eps) {
        double r66525 = x;
        double r66526 = 0.8925960409309325;
        bool r66527 = r66525 <= r66526;
        double r66528 = 1.3877787807814457e-17;
        double r66529 = 3.0;
        double r66530 = pow(r66525, r66529);
        double r66531 = eps;
        double r66532 = r66530 / r66531;
        double r66533 = 1.0;
        double r66534 = 0.5;
        double r66535 = 2.0;
        double r66536 = pow(r66525, r66535);
        double r66537 = r66534 * r66536;
        double r66538 = r66533 - r66537;
        double r66539 = fma(r66528, r66532, r66538);
        double r66540 = cbrt(r66539);
        double r66541 = 0.3333333333333333;
        double r66542 = pow(r66533, r66541);
        double r66543 = 0.16666666666666666;
        double r66544 = r66536 * r66542;
        double r66545 = r66543 * r66544;
        double r66546 = r66542 - r66545;
        double r66547 = r66540 * r66546;
        double r66548 = r66547 * r66540;
        double r66549 = r66533 + r66531;
        double r66550 = r66549 * r66525;
        double r66551 = -r66550;
        double r66552 = exp(r66551);
        double r66553 = 2.0;
        double r66554 = r66552 / r66553;
        double r66555 = r66533 / r66531;
        double r66556 = r66533 - r66555;
        double r66557 = r66533 + r66555;
        double r66558 = r66533 - r66531;
        double r66559 = r66558 * r66525;
        double r66560 = exp(r66559);
        double r66561 = r66553 * r66560;
        double r66562 = r66557 / r66561;
        double r66563 = fma(r66554, r66556, r66562);
        double r66564 = r66527 ? r66548 : r66563;
        return r66564;
}

Error

Bits error versus x

Bits error versus eps

Derivation

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

    1. Initial program 38.6

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

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

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

      \[\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 add-cube-cbrt7.0

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

      \[\leadsto \left(\sqrt[3]{\mathsf{fma}\left(1.38778 \cdot 10^{-17}, \frac{{x}^{3}}{\varepsilon}, 1 - 0.5 \cdot {x}^{2}\right)} \cdot \color{blue}{\left({1}^{\frac{1}{3}} - 0.166666666666666657 \cdot \left({x}^{2} \cdot {1}^{\frac{1}{3}}\right)\right)}\right) \cdot \sqrt[3]{\mathsf{fma}\left(1.38778 \cdot 10^{-17}, \frac{{x}^{3}}{\varepsilon}, 1 - 0.5 \cdot {x}^{2}\right)}\]

    if 0.8925960409309325 < x

    1. Initial program 0.6

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

      \[\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. Recombined 2 regimes into one program.
  4. Final simplification5.3

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le 0.892596040930932477:\\ \;\;\;\;\left(\sqrt[3]{\mathsf{fma}\left(1.38778 \cdot 10^{-17}, \frac{{x}^{3}}{\varepsilon}, 1 - 0.5 \cdot {x}^{2}\right)} \cdot \left({1}^{\frac{1}{3}} - 0.166666666666666657 \cdot \left({x}^{2} \cdot {1}^{\frac{1}{3}}\right)\right)\right) \cdot \sqrt[3]{\mathsf{fma}\left(1.38778 \cdot 10^{-17}, \frac{{x}^{3}}{\varepsilon}, 1 - 0.5 \cdot {x}^{2}\right)}\\ \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 e^{\left(1 - \varepsilon\right) \cdot x}}\right)\\ \end{array}\]

Reproduce

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