Average Error: 58.1 → 0.3
Time: 18.7s
Precision: 64
\[\frac{e^{x} - e^{-x}}{2}\]
\[\begin{array}{l} \mathbf{if}\;x \le -0.01529821241413806959252852379904652480036:\\ \;\;\;\;\frac{\frac{e^{x}}{{\left(e^{-2}\right)}^{x} + 1} - \frac{1}{{\left(e^{x}\right)}^{3} + e^{x}}}{2}\\ \mathbf{else}:\\ \;\;\;\;\frac{\mathsf{fma}\left(\frac{1}{3}, {x}^{3}, \mathsf{fma}\left(\frac{1}{60}, {x}^{5}, 2 \cdot x\right)\right)}{2}\\ \end{array}\]
\frac{e^{x} - e^{-x}}{2}
\begin{array}{l}
\mathbf{if}\;x \le -0.01529821241413806959252852379904652480036:\\
\;\;\;\;\frac{\frac{e^{x}}{{\left(e^{-2}\right)}^{x} + 1} - \frac{1}{{\left(e^{x}\right)}^{3} + e^{x}}}{2}\\

\mathbf{else}:\\
\;\;\;\;\frac{\mathsf{fma}\left(\frac{1}{3}, {x}^{3}, \mathsf{fma}\left(\frac{1}{60}, {x}^{5}, 2 \cdot x\right)\right)}{2}\\

\end{array}
double f(double x) {
        double r39033 = x;
        double r39034 = exp(r39033);
        double r39035 = -r39033;
        double r39036 = exp(r39035);
        double r39037 = r39034 - r39036;
        double r39038 = 2.0;
        double r39039 = r39037 / r39038;
        return r39039;
}

double f(double x) {
        double r39040 = x;
        double r39041 = -0.01529821241413807;
        bool r39042 = r39040 <= r39041;
        double r39043 = exp(r39040);
        double r39044 = -2.0;
        double r39045 = exp(r39044);
        double r39046 = pow(r39045, r39040);
        double r39047 = 1.0;
        double r39048 = r39046 + r39047;
        double r39049 = r39043 / r39048;
        double r39050 = 3.0;
        double r39051 = pow(r39043, r39050);
        double r39052 = r39051 + r39043;
        double r39053 = r39047 / r39052;
        double r39054 = r39049 - r39053;
        double r39055 = 2.0;
        double r39056 = r39054 / r39055;
        double r39057 = 0.3333333333333333;
        double r39058 = pow(r39040, r39050);
        double r39059 = 0.016666666666666666;
        double r39060 = 5.0;
        double r39061 = pow(r39040, r39060);
        double r39062 = 2.0;
        double r39063 = r39062 * r39040;
        double r39064 = fma(r39059, r39061, r39063);
        double r39065 = fma(r39057, r39058, r39064);
        double r39066 = r39065 / r39055;
        double r39067 = r39042 ? r39056 : r39066;
        return r39067;
}

Error

Bits error versus x

Derivation

  1. Split input into 2 regimes
  2. if x < -0.01529821241413807

    1. Initial program 0.7

      \[\frac{e^{x} - e^{-x}}{2}\]
    2. Using strategy rm
    3. Applied flip--5.3

      \[\leadsto \frac{\color{blue}{\frac{e^{x} \cdot e^{x} - e^{-x} \cdot e^{-x}}{e^{x} + e^{-x}}}}{2}\]
    4. Simplified5.2

      \[\leadsto \frac{\frac{\color{blue}{e^{x + x} - e^{x \cdot -2}}}{e^{x} + e^{-x}}}{2}\]
    5. Using strategy rm
    6. Applied div-sub5.2

      \[\leadsto \frac{\color{blue}{\frac{e^{x + x}}{e^{x} + e^{-x}} - \frac{e^{x \cdot -2}}{e^{x} + e^{-x}}}}{2}\]
    7. Simplified5.4

      \[\leadsto \frac{\color{blue}{\frac{e^{x}}{{\left(e^{-2}\right)}^{x} + 1}} - \frac{e^{x \cdot -2}}{e^{x} + e^{-x}}}{2}\]
    8. Simplified0.7

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

    if -0.01529821241413807 < x

    1. Initial program 58.5

      \[\frac{e^{x} - e^{-x}}{2}\]
    2. Taylor expanded around 0 0.3

      \[\leadsto \frac{\color{blue}{\frac{1}{3} \cdot {x}^{3} + \left(\frac{1}{60} \cdot {x}^{5} + 2 \cdot x\right)}}{2}\]
    3. Simplified0.3

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

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

Reproduce

herbie shell --seed 2019323 +o rules:numerics
(FPCore (x)
  :name "Hyperbolic sine"
  :precision binary64
  (/ (- (exp x) (exp (- x))) 2))