Average Error: 30.2 → 0.0
Time: 21.3s
Precision: 64
\[\left(e^{x} - 2\right) + e^{-x}\]
\[\begin{array}{l} \mathbf{if}\;\left(e^{x} - 2\right) + e^{-x} \le 0.001003621650167874079784269270021468400955:\\ \;\;\;\;\mathsf{fma}\left(x, x, \mathsf{fma}\left(\frac{1}{360}, {x}^{6}, \frac{1}{12} \cdot {x}^{4}\right)\right)\\ \mathbf{else}:\\ \;\;\;\;\left(e^{x} - 2\right) + e^{-x}\\ \end{array}\]
\left(e^{x} - 2\right) + e^{-x}
\begin{array}{l}
\mathbf{if}\;\left(e^{x} - 2\right) + e^{-x} \le 0.001003621650167874079784269270021468400955:\\
\;\;\;\;\mathsf{fma}\left(x, x, \mathsf{fma}\left(\frac{1}{360}, {x}^{6}, \frac{1}{12} \cdot {x}^{4}\right)\right)\\

\mathbf{else}:\\
\;\;\;\;\left(e^{x} - 2\right) + e^{-x}\\

\end{array}
double f(double x) {
        double r85200 = x;
        double r85201 = exp(r85200);
        double r85202 = 2.0;
        double r85203 = r85201 - r85202;
        double r85204 = -r85200;
        double r85205 = exp(r85204);
        double r85206 = r85203 + r85205;
        return r85206;
}

double f(double x) {
        double r85207 = x;
        double r85208 = exp(r85207);
        double r85209 = 2.0;
        double r85210 = r85208 - r85209;
        double r85211 = -r85207;
        double r85212 = exp(r85211);
        double r85213 = r85210 + r85212;
        double r85214 = 0.001003621650167874;
        bool r85215 = r85213 <= r85214;
        double r85216 = 0.002777777777777778;
        double r85217 = 6.0;
        double r85218 = pow(r85207, r85217);
        double r85219 = 0.08333333333333333;
        double r85220 = 4.0;
        double r85221 = pow(r85207, r85220);
        double r85222 = r85219 * r85221;
        double r85223 = fma(r85216, r85218, r85222);
        double r85224 = fma(r85207, r85207, r85223);
        double r85225 = r85215 ? r85224 : r85213;
        return r85225;
}

Error

Bits error versus x

Target

Original30.2
Target0.0
Herbie0.0
\[4 \cdot {\left(\sinh \left(\frac{x}{2}\right)\right)}^{2}\]

Derivation

  1. Split input into 2 regimes
  2. if (+ (- (exp x) 2.0) (exp (- x))) < 0.001003621650167874

    1. Initial program 30.7

      \[\left(e^{x} - 2\right) + e^{-x}\]
    2. Taylor expanded around 0 0.0

      \[\leadsto \color{blue}{{x}^{2} + \left(\frac{1}{360} \cdot {x}^{6} + \frac{1}{12} \cdot {x}^{4}\right)}\]
    3. Simplified0.0

      \[\leadsto \color{blue}{\mathsf{fma}\left(x, x, \mathsf{fma}\left(\frac{1}{360}, {x}^{6}, \frac{1}{12} \cdot {x}^{4}\right)\right)}\]

    if 0.001003621650167874 < (+ (- (exp x) 2.0) (exp (- x)))

    1. Initial program 1.8

      \[\left(e^{x} - 2\right) + e^{-x}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.0

    \[\leadsto \begin{array}{l} \mathbf{if}\;\left(e^{x} - 2\right) + e^{-x} \le 0.001003621650167874079784269270021468400955:\\ \;\;\;\;\mathsf{fma}\left(x, x, \mathsf{fma}\left(\frac{1}{360}, {x}^{6}, \frac{1}{12} \cdot {x}^{4}\right)\right)\\ \mathbf{else}:\\ \;\;\;\;\left(e^{x} - 2\right) + e^{-x}\\ \end{array}\]

Reproduce

herbie shell --seed 2019209 +o rules:numerics
(FPCore (x)
  :name "exp2 (problem 3.3.7)"
  :precision binary64

  :herbie-target
  (* 4 (pow (sinh (/ x 2)) 2))

  (+ (- (exp x) 2) (exp (- x))))