Average Error: 28.8 → 1.3
Time: 55.5s
Precision: 64
\[\frac{\left(1.0 + \frac{1.0}{\varepsilon}\right) \cdot e^{-\left(1.0 - \varepsilon\right) \cdot x} - \left(\frac{1.0}{\varepsilon} - 1.0\right) \cdot e^{-\left(1.0 + \varepsilon\right) \cdot x}}{2.0}\]
\[\begin{array}{l} \mathbf{if}\;x \le 0.000489189965940405:\\ \;\;\;\;\frac{2.0 - \mathsf{fma}\left(1.0, x \cdot x, \log \left(e^{\left(x \cdot x\right) \cdot x}\right) \cdot \frac{2.7755575615628914 \cdot 10^{-17}}{\varepsilon}\right)}{2.0}\\ \mathbf{else}:\\ \;\;\;\;\frac{\mathsf{fma}\left(e^{x \cdot \left(\varepsilon - 1.0\right)}, \frac{1.0}{\varepsilon} + 1.0, \frac{\sqrt[3]{1.0 - \frac{1.0}{\varepsilon}}}{\sqrt{e^{x \cdot \left(\varepsilon + 1.0\right)}}} \cdot \frac{\sqrt[3]{1.0 - \frac{1.0}{\varepsilon}} \cdot \sqrt[3]{1.0 - \frac{1.0}{\varepsilon}}}{\sqrt{e^{x \cdot \left(\varepsilon + 1.0\right)}}}\right)}{2.0}\\ \end{array}\]
\frac{\left(1.0 + \frac{1.0}{\varepsilon}\right) \cdot e^{-\left(1.0 - \varepsilon\right) \cdot x} - \left(\frac{1.0}{\varepsilon} - 1.0\right) \cdot e^{-\left(1.0 + \varepsilon\right) \cdot x}}{2.0}
\begin{array}{l}
\mathbf{if}\;x \le 0.000489189965940405:\\
\;\;\;\;\frac{2.0 - \mathsf{fma}\left(1.0, x \cdot x, \log \left(e^{\left(x \cdot x\right) \cdot x}\right) \cdot \frac{2.7755575615628914 \cdot 10^{-17}}{\varepsilon}\right)}{2.0}\\

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

\end{array}
double f(double x, double eps) {
        double r2396393 = 1.0;
        double r2396394 = eps;
        double r2396395 = r2396393 / r2396394;
        double r2396396 = r2396393 + r2396395;
        double r2396397 = r2396393 - r2396394;
        double r2396398 = x;
        double r2396399 = r2396397 * r2396398;
        double r2396400 = -r2396399;
        double r2396401 = exp(r2396400);
        double r2396402 = r2396396 * r2396401;
        double r2396403 = r2396395 - r2396393;
        double r2396404 = r2396393 + r2396394;
        double r2396405 = r2396404 * r2396398;
        double r2396406 = -r2396405;
        double r2396407 = exp(r2396406);
        double r2396408 = r2396403 * r2396407;
        double r2396409 = r2396402 - r2396408;
        double r2396410 = 2.0;
        double r2396411 = r2396409 / r2396410;
        return r2396411;
}

double f(double x, double eps) {
        double r2396412 = x;
        double r2396413 = 0.000489189965940405;
        bool r2396414 = r2396412 <= r2396413;
        double r2396415 = 2.0;
        double r2396416 = 1.0;
        double r2396417 = r2396412 * r2396412;
        double r2396418 = r2396417 * r2396412;
        double r2396419 = exp(r2396418);
        double r2396420 = log(r2396419);
        double r2396421 = 2.7755575615628914e-17;
        double r2396422 = eps;
        double r2396423 = r2396421 / r2396422;
        double r2396424 = r2396420 * r2396423;
        double r2396425 = fma(r2396416, r2396417, r2396424);
        double r2396426 = r2396415 - r2396425;
        double r2396427 = r2396426 / r2396415;
        double r2396428 = r2396422 - r2396416;
        double r2396429 = r2396412 * r2396428;
        double r2396430 = exp(r2396429);
        double r2396431 = r2396416 / r2396422;
        double r2396432 = r2396431 + r2396416;
        double r2396433 = r2396416 - r2396431;
        double r2396434 = cbrt(r2396433);
        double r2396435 = r2396422 + r2396416;
        double r2396436 = r2396412 * r2396435;
        double r2396437 = exp(r2396436);
        double r2396438 = sqrt(r2396437);
        double r2396439 = r2396434 / r2396438;
        double r2396440 = r2396434 * r2396434;
        double r2396441 = r2396440 / r2396438;
        double r2396442 = r2396439 * r2396441;
        double r2396443 = fma(r2396430, r2396432, r2396442);
        double r2396444 = r2396443 / r2396415;
        double r2396445 = r2396414 ? r2396427 : r2396444;
        return r2396445;
}

Error

Bits error versus x

Bits error versus eps

Derivation

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

    1. Initial program 37.7

      \[\frac{\left(1.0 + \frac{1.0}{\varepsilon}\right) \cdot e^{-\left(1.0 - \varepsilon\right) \cdot x} - \left(\frac{1.0}{\varepsilon} - 1.0\right) \cdot e^{-\left(1.0 + \varepsilon\right) \cdot x}}{2.0}\]
    2. Simplified37.7

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

      \[\leadsto \frac{\color{blue}{2.0 - \left(1.0 \cdot {x}^{2} + 2.7755575615628914 \cdot 10^{-17} \cdot \frac{{x}^{3}}{\varepsilon}\right)}}{2.0}\]
    4. Simplified6.7

      \[\leadsto \frac{\color{blue}{2.0 - \mathsf{fma}\left(1.0, x \cdot x, \frac{2.7755575615628914 \cdot 10^{-17}}{\varepsilon} \cdot \left(\left(x \cdot x\right) \cdot x\right)\right)}}{2.0}\]
    5. Using strategy rm
    6. Applied add-log-exp1.3

      \[\leadsto \frac{2.0 - \mathsf{fma}\left(1.0, x \cdot x, \frac{2.7755575615628914 \cdot 10^{-17}}{\varepsilon} \cdot \color{blue}{\log \left(e^{\left(x \cdot x\right) \cdot x}\right)}\right)}{2.0}\]

    if 0.000489189965940405 < x

    1. Initial program 1.1

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

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

      \[\leadsto \frac{\mathsf{fma}\left(e^{x \cdot \left(\varepsilon - 1.0\right)}, \frac{1.0}{\varepsilon} + 1.0, \frac{1.0 - \frac{1.0}{\varepsilon}}{\color{blue}{\sqrt{e^{x \cdot \left(\varepsilon + 1.0\right)}} \cdot \sqrt{e^{x \cdot \left(\varepsilon + 1.0\right)}}}}\right)}{2.0}\]
    5. Applied add-cube-cbrt1.1

      \[\leadsto \frac{\mathsf{fma}\left(e^{x \cdot \left(\varepsilon - 1.0\right)}, \frac{1.0}{\varepsilon} + 1.0, \frac{\color{blue}{\left(\sqrt[3]{1.0 - \frac{1.0}{\varepsilon}} \cdot \sqrt[3]{1.0 - \frac{1.0}{\varepsilon}}\right) \cdot \sqrt[3]{1.0 - \frac{1.0}{\varepsilon}}}}{\sqrt{e^{x \cdot \left(\varepsilon + 1.0\right)}} \cdot \sqrt{e^{x \cdot \left(\varepsilon + 1.0\right)}}}\right)}{2.0}\]
    6. Applied times-frac1.1

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le 0.000489189965940405:\\ \;\;\;\;\frac{2.0 - \mathsf{fma}\left(1.0, x \cdot x, \log \left(e^{\left(x \cdot x\right) \cdot x}\right) \cdot \frac{2.7755575615628914 \cdot 10^{-17}}{\varepsilon}\right)}{2.0}\\ \mathbf{else}:\\ \;\;\;\;\frac{\mathsf{fma}\left(e^{x \cdot \left(\varepsilon - 1.0\right)}, \frac{1.0}{\varepsilon} + 1.0, \frac{\sqrt[3]{1.0 - \frac{1.0}{\varepsilon}}}{\sqrt{e^{x \cdot \left(\varepsilon + 1.0\right)}}} \cdot \frac{\sqrt[3]{1.0 - \frac{1.0}{\varepsilon}} \cdot \sqrt[3]{1.0 - \frac{1.0}{\varepsilon}}}{\sqrt{e^{x \cdot \left(\varepsilon + 1.0\right)}}}\right)}{2.0}\\ \end{array}\]

Reproduce

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