Average Error: 28.7 → 1.4
Time: 43.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.47988680957016616383087846686716915201 \cdot 10^{-6}:\\ \;\;\;\;\frac{\sqrt[3]{\left(\left(x \cdot x\right) \cdot \left(\left(0.6666666666666667406815349750104360282421 \cdot x - 1\right)\right)\right) \cdot \left(\left(\left(x \cdot x\right) \cdot \left(\left(0.6666666666666667406815349750104360282421 \cdot x - 1\right)\right)\right) \cdot \left(\left(x \cdot x\right) \cdot \left(\left(0.6666666666666667406815349750104360282421 \cdot x - 1\right)\right)\right)\right)} + 2}{2}\\ \mathbf{else}:\\ \;\;\;\;\frac{\left(\frac{1}{\varepsilon} + 1\right) \cdot \mathsf{expm1}\left(\mathsf{log1p}\left(e^{\left(-x\right) \cdot \left(1 - \varepsilon\right)}\right)\right) - e^{\left(\varepsilon + 1\right) \cdot \left(-x\right)} \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 1.47988680957016616383087846686716915201 \cdot 10^{-6}:\\
\;\;\;\;\frac{\sqrt[3]{\left(\left(x \cdot x\right) \cdot \left(\left(0.6666666666666667406815349750104360282421 \cdot x - 1\right)\right)\right) \cdot \left(\left(\left(x \cdot x\right) \cdot \left(\left(0.6666666666666667406815349750104360282421 \cdot x - 1\right)\right)\right) \cdot \left(\left(x \cdot x\right) \cdot \left(\left(0.6666666666666667406815349750104360282421 \cdot x - 1\right)\right)\right)\right)} + 2}{2}\\

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

\end{array}
double f(double x, double eps) {
        double r2137154 = 1.0;
        double r2137155 = eps;
        double r2137156 = r2137154 / r2137155;
        double r2137157 = r2137154 + r2137156;
        double r2137158 = r2137154 - r2137155;
        double r2137159 = x;
        double r2137160 = r2137158 * r2137159;
        double r2137161 = -r2137160;
        double r2137162 = exp(r2137161);
        double r2137163 = r2137157 * r2137162;
        double r2137164 = r2137156 - r2137154;
        double r2137165 = r2137154 + r2137155;
        double r2137166 = r2137165 * r2137159;
        double r2137167 = -r2137166;
        double r2137168 = exp(r2137167);
        double r2137169 = r2137164 * r2137168;
        double r2137170 = r2137163 - r2137169;
        double r2137171 = 2.0;
        double r2137172 = r2137170 / r2137171;
        return r2137172;
}

double f(double x, double eps) {
        double r2137173 = x;
        double r2137174 = 1.4798868095701662e-06;
        bool r2137175 = r2137173 <= r2137174;
        double r2137176 = r2137173 * r2137173;
        double r2137177 = 0.6666666666666667;
        double r2137178 = r2137177 * r2137173;
        double r2137179 = 1.0;
        double r2137180 = r2137178 - r2137179;
        double r2137181 = /* ERROR: no posit support in C */;
        double r2137182 = /* ERROR: no posit support in C */;
        double r2137183 = r2137176 * r2137182;
        double r2137184 = r2137183 * r2137183;
        double r2137185 = r2137183 * r2137184;
        double r2137186 = cbrt(r2137185);
        double r2137187 = 2.0;
        double r2137188 = r2137186 + r2137187;
        double r2137189 = r2137188 / r2137187;
        double r2137190 = eps;
        double r2137191 = r2137179 / r2137190;
        double r2137192 = r2137191 + r2137179;
        double r2137193 = -r2137173;
        double r2137194 = r2137179 - r2137190;
        double r2137195 = r2137193 * r2137194;
        double r2137196 = exp(r2137195);
        double r2137197 = log1p(r2137196);
        double r2137198 = expm1(r2137197);
        double r2137199 = r2137192 * r2137198;
        double r2137200 = r2137190 + r2137179;
        double r2137201 = r2137200 * r2137193;
        double r2137202 = exp(r2137201);
        double r2137203 = r2137191 - r2137179;
        double r2137204 = r2137202 * r2137203;
        double r2137205 = r2137199 - r2137204;
        double r2137206 = r2137205 / r2137187;
        double r2137207 = r2137175 ? r2137189 : r2137206;
        return r2137207;
}

Error

Bits error versus x

Bits error versus eps

Derivation

  1. Split input into 2 regimes
  2. if x < 1.4798868095701662e-06

    1. Initial program 38.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.4

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

      \[\leadsto \frac{\color{blue}{\mathsf{fma}\left(x \cdot \left(x \cdot x\right), 0.6666666666666667406815349750104360282421, 2 - \left(x \cdot x\right) \cdot 1\right)}}{2}\]
    4. Taylor expanded around 0 1.4

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

      \[\leadsto \frac{\color{blue}{2 + \left(x \cdot x\right) \cdot \left(0.6666666666666667406815349750104360282421 \cdot x - 1\right)}}{2}\]
    6. Using strategy rm
    7. Applied insert-posit161.4

      \[\leadsto \frac{2 + \left(x \cdot x\right) \cdot \color{blue}{\left(\left(0.6666666666666667406815349750104360282421 \cdot x - 1\right)\right)}}{2}\]
    8. Using strategy rm
    9. Applied add-cbrt-cube1.4

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

    if 1.4798868095701662e-06 < x

    1. Initial program 1.7

      \[\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 expm1-log1p-u1.7

      \[\leadsto \frac{\left(1 + \frac{1}{\varepsilon}\right) \cdot \color{blue}{\mathsf{expm1}\left(\mathsf{log1p}\left(e^{-\left(1 - \varepsilon\right) \cdot x}\right)\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 simplification1.4

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

Reproduce

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