Average Error: 30.1 → 0.8
Time: 30.1s
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 45.88594712019421706372668268159031867981:\\ \;\;\;\;\frac{0.6666666666666667406815349750104360282421 \cdot {x}^{3} + \left(2 - 1 \cdot {x}^{2}\right)}{2}\\ \mathbf{else}:\\ \;\;\;\;\frac{\mathsf{fma}\left(1 + \frac{1}{\varepsilon}, e^{-\left(1 - \varepsilon\right) \cdot x}, -\frac{\frac{1}{\varepsilon} - 1}{e^{\left(1 + \varepsilon\right) \cdot x}}\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 45.88594712019421706372668268159031867981:\\
\;\;\;\;\frac{0.6666666666666667406815349750104360282421 \cdot {x}^{3} + \left(2 - 1 \cdot {x}^{2}\right)}{2}\\

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

\end{array}
double f(double x, double eps) {
        double r47887 = 1.0;
        double r47888 = eps;
        double r47889 = r47887 / r47888;
        double r47890 = r47887 + r47889;
        double r47891 = r47887 - r47888;
        double r47892 = x;
        double r47893 = r47891 * r47892;
        double r47894 = -r47893;
        double r47895 = exp(r47894);
        double r47896 = r47890 * r47895;
        double r47897 = r47889 - r47887;
        double r47898 = r47887 + r47888;
        double r47899 = r47898 * r47892;
        double r47900 = -r47899;
        double r47901 = exp(r47900);
        double r47902 = r47897 * r47901;
        double r47903 = r47896 - r47902;
        double r47904 = 2.0;
        double r47905 = r47903 / r47904;
        return r47905;
}

double f(double x, double eps) {
        double r47906 = x;
        double r47907 = 45.88594712019422;
        bool r47908 = r47906 <= r47907;
        double r47909 = 0.6666666666666667;
        double r47910 = 3.0;
        double r47911 = pow(r47906, r47910);
        double r47912 = r47909 * r47911;
        double r47913 = 2.0;
        double r47914 = 1.0;
        double r47915 = 2.0;
        double r47916 = pow(r47906, r47915);
        double r47917 = r47914 * r47916;
        double r47918 = r47913 - r47917;
        double r47919 = r47912 + r47918;
        double r47920 = r47919 / r47913;
        double r47921 = eps;
        double r47922 = r47914 / r47921;
        double r47923 = r47914 + r47922;
        double r47924 = r47914 - r47921;
        double r47925 = r47924 * r47906;
        double r47926 = -r47925;
        double r47927 = exp(r47926);
        double r47928 = r47922 - r47914;
        double r47929 = r47914 + r47921;
        double r47930 = r47929 * r47906;
        double r47931 = exp(r47930);
        double r47932 = r47928 / r47931;
        double r47933 = -r47932;
        double r47934 = fma(r47923, r47927, r47933);
        double r47935 = r47934 / r47913;
        double r47936 = r47908 ? r47920 : r47935;
        return r47936;
}

Error

Bits error versus x

Bits error versus eps

Derivation

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

    1. Initial program 39.8

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

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

      \[\leadsto \frac{\color{blue}{\mathsf{fma}\left(0.6666666666666667406815349750104360282421, {x}^{3}, 2\right) - 1 \cdot {x}^{2}}}{2}\]
    4. Using strategy rm
    5. Applied fma-udef1.0

      \[\leadsto \frac{\color{blue}{\left(0.6666666666666667406815349750104360282421 \cdot {x}^{3} + 2\right)} - 1 \cdot {x}^{2}}{2}\]
    6. Applied associate--l+1.0

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

    if 45.88594712019422 < x

    1. Initial program 0.3

      \[\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 fma-neg0.3

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

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

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

Reproduce

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