Average Error: 29.3 → 0.9
Time: 27.3s
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 15.69605451446852306673918064916506409645:\\ \;\;\;\;\frac{\mathsf{fma}\left(0.6666666666666667406815349750104360282421, \left(x \cdot x\right) \cdot x, 2\right) - \left(x \cdot x\right) \cdot 1}{2}\\ \mathbf{else}:\\ \;\;\;\;\frac{\left(\frac{1}{\varepsilon} + 1\right) \cdot \left(\sqrt[3]{e^{\left(1 - \varepsilon\right) \cdot \left(-x\right)}} \cdot \left(\sqrt[3]{e^{\left(1 - \varepsilon\right) \cdot \left(-x\right)}} \cdot \sqrt[3]{e^{\left(1 - \varepsilon\right) \cdot \left(-x\right)}}\right)\right) - e^{\left(-\left(\varepsilon + 1\right)\right) \cdot x} \cdot \left(\frac{1}{\varepsilon} - 1\right)}{2}\\ \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 15.69605451446852306673918064916506409645:\\
\;\;\;\;\frac{\mathsf{fma}\left(0.6666666666666667406815349750104360282421, \left(x \cdot x\right) \cdot x, 2\right) - \left(x \cdot x\right) \cdot 1}{2}\\

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

\end{array}
double f(double x, double eps) {
        double r2379875 = 1.0;
        double r2379876 = eps;
        double r2379877 = r2379875 / r2379876;
        double r2379878 = r2379875 + r2379877;
        double r2379879 = r2379875 - r2379876;
        double r2379880 = x;
        double r2379881 = r2379879 * r2379880;
        double r2379882 = -r2379881;
        double r2379883 = exp(r2379882);
        double r2379884 = r2379878 * r2379883;
        double r2379885 = r2379877 - r2379875;
        double r2379886 = r2379875 + r2379876;
        double r2379887 = r2379886 * r2379880;
        double r2379888 = -r2379887;
        double r2379889 = exp(r2379888);
        double r2379890 = r2379885 * r2379889;
        double r2379891 = r2379884 - r2379890;
        double r2379892 = 2.0;
        double r2379893 = r2379891 / r2379892;
        return r2379893;
}

double f(double x, double eps) {
        double r2379894 = x;
        double r2379895 = 15.696054514468523;
        bool r2379896 = r2379894 <= r2379895;
        double r2379897 = 0.6666666666666667;
        double r2379898 = r2379894 * r2379894;
        double r2379899 = r2379898 * r2379894;
        double r2379900 = 2.0;
        double r2379901 = fma(r2379897, r2379899, r2379900);
        double r2379902 = 1.0;
        double r2379903 = r2379898 * r2379902;
        double r2379904 = r2379901 - r2379903;
        double r2379905 = r2379904 / r2379900;
        double r2379906 = eps;
        double r2379907 = r2379902 / r2379906;
        double r2379908 = r2379907 + r2379902;
        double r2379909 = r2379902 - r2379906;
        double r2379910 = -r2379894;
        double r2379911 = r2379909 * r2379910;
        double r2379912 = exp(r2379911);
        double r2379913 = cbrt(r2379912);
        double r2379914 = r2379913 * r2379913;
        double r2379915 = r2379913 * r2379914;
        double r2379916 = r2379908 * r2379915;
        double r2379917 = r2379906 + r2379902;
        double r2379918 = -r2379917;
        double r2379919 = r2379918 * r2379894;
        double r2379920 = exp(r2379919);
        double r2379921 = r2379907 - r2379902;
        double r2379922 = r2379920 * r2379921;
        double r2379923 = r2379916 - r2379922;
        double r2379924 = r2379923 / r2379900;
        double r2379925 = r2379896 ? r2379905 : r2379924;
        return r2379925;
}

Error

Bits error versus x

Bits error versus eps

Derivation

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

    1. Initial program 39.1

      \[\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. Taylor expanded around 0 1.1

      \[\leadsto \frac{\color{blue}{\left(0.6666666666666667406815349750104360282421 \cdot {x}^{3} + 2\right) - 1 \cdot {x}^{2}}}{2}\]
    3. Simplified1.1

      \[\leadsto \frac{\color{blue}{\mathsf{fma}\left(0.6666666666666667406815349750104360282421, x \cdot \left(x \cdot x\right), 2\right) - 1 \cdot \left(x \cdot x\right)}}{2}\]

    if 15.696054514468523 < 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. Using strategy rm
    3. Applied add-cube-cbrt0.4

      \[\leadsto \frac{\left(1 + \frac{1}{\varepsilon}\right) \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)} - \left(\frac{1}{\varepsilon} - 1\right) \cdot e^{-\left(1 + \varepsilon\right) \cdot x}}{2}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.9

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

Reproduce

herbie shell --seed 2019170 +o rules:numerics
(FPCore (x eps)
  :name "NMSE Section 6.1 mentioned, A"
  (/ (- (* (+ 1.0 (/ 1.0 eps)) (exp (- (* (- 1.0 eps) x)))) (* (- (/ 1.0 eps) 1.0) (exp (- (* (+ 1.0 eps) x))))) 2.0))