Average Error: 40.1 → 0.3
Time: 3.9s
Precision: 64
\[\frac{e^{x} - 1}{x}\]
\[\begin{array}{l} \mathbf{if}\;x \le -9.0413827379038481 \cdot 10^{-5}:\\ \;\;\;\;\mathsf{expm1}\left(\mathsf{log1p}\left(\frac{\frac{\mathsf{fma}\left(-1, 1, e^{x + x}\right)}{e^{x} + 1}}{x}\right)\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(\frac{1}{6}, {x}^{2}, \mathsf{fma}\left(\frac{1}{2}, x, 1\right)\right)\\ \end{array}\]
\frac{e^{x} - 1}{x}
\begin{array}{l}
\mathbf{if}\;x \le -9.0413827379038481 \cdot 10^{-5}:\\
\;\;\;\;\mathsf{expm1}\left(\mathsf{log1p}\left(\frac{\frac{\mathsf{fma}\left(-1, 1, e^{x + x}\right)}{e^{x} + 1}}{x}\right)\right)\\

\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(\frac{1}{6}, {x}^{2}, \mathsf{fma}\left(\frac{1}{2}, x, 1\right)\right)\\

\end{array}
double f(double x) {
        double r91018 = x;
        double r91019 = exp(r91018);
        double r91020 = 1.0;
        double r91021 = r91019 - r91020;
        double r91022 = r91021 / r91018;
        return r91022;
}

double f(double x) {
        double r91023 = x;
        double r91024 = -9.041382737903848e-05;
        bool r91025 = r91023 <= r91024;
        double r91026 = 1.0;
        double r91027 = -r91026;
        double r91028 = r91023 + r91023;
        double r91029 = exp(r91028);
        double r91030 = fma(r91027, r91026, r91029);
        double r91031 = exp(r91023);
        double r91032 = r91031 + r91026;
        double r91033 = r91030 / r91032;
        double r91034 = r91033 / r91023;
        double r91035 = log1p(r91034);
        double r91036 = expm1(r91035);
        double r91037 = 0.16666666666666666;
        double r91038 = 2.0;
        double r91039 = pow(r91023, r91038);
        double r91040 = 0.5;
        double r91041 = 1.0;
        double r91042 = fma(r91040, r91023, r91041);
        double r91043 = fma(r91037, r91039, r91042);
        double r91044 = r91025 ? r91036 : r91043;
        return r91044;
}

Error

Bits error versus x

Target

Original40.1
Target40.5
Herbie0.3
\[\begin{array}{l} \mathbf{if}\;x \lt 1 \land x \gt -1:\\ \;\;\;\;\frac{e^{x} - 1}{\log \left(e^{x}\right)}\\ \mathbf{else}:\\ \;\;\;\;\frac{e^{x} - 1}{x}\\ \end{array}\]

Derivation

  1. Split input into 2 regimes
  2. if x < -9.041382737903848e-05

    1. Initial program 0.1

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

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

      \[\leadsto \frac{\frac{\color{blue}{\mathsf{fma}\left(-1, 1, e^{x + x}\right)}}{e^{x} + 1}}{x}\]
    5. Using strategy rm
    6. Applied expm1-log1p-u0.1

      \[\leadsto \color{blue}{\mathsf{expm1}\left(\mathsf{log1p}\left(\frac{\frac{\mathsf{fma}\left(-1, 1, e^{x + x}\right)}{e^{x} + 1}}{x}\right)\right)}\]

    if -9.041382737903848e-05 < x

    1. Initial program 60.1

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

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

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

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

Reproduce

herbie shell --seed 2020100 +o rules:numerics
(FPCore (x)
  :name "Kahan's exp quotient"
  :precision binary64

  :herbie-target
  (if (and (< x 1) (> x -1)) (/ (- (exp x) 1) (log (exp x))) (/ (- (exp x) 1) x))

  (/ (- (exp x) 1) x))