Average Error: 40.0 → 0.3
Time: 11.3s
Precision: 64
\[\frac{e^{x} - 1}{x}\]
\[\begin{array}{l} \mathbf{if}\;x \le -1.592720854531125653560236221650825427787 \cdot 10^{-4}:\\ \;\;\;\;\frac{\frac{{\left(e^{x}\right)}^{3} - {1}^{3}}{\mathsf{fma}\left(e^{x}, e^{x} + 1, 1 \cdot 1\right)}}{x}\\ \mathbf{else}:\\ \;\;\;\;\frac{\mathsf{fma}\left(x \cdot x, \mathsf{fma}\left(\frac{1}{6}, x, \frac{1}{2}\right), x\right)}{x}\\ \end{array}\]
\frac{e^{x} - 1}{x}
\begin{array}{l}
\mathbf{if}\;x \le -1.592720854531125653560236221650825427787 \cdot 10^{-4}:\\
\;\;\;\;\frac{\frac{{\left(e^{x}\right)}^{3} - {1}^{3}}{\mathsf{fma}\left(e^{x}, e^{x} + 1, 1 \cdot 1\right)}}{x}\\

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

\end{array}
double f(double x) {
        double r69295 = x;
        double r69296 = exp(r69295);
        double r69297 = 1.0;
        double r69298 = r69296 - r69297;
        double r69299 = r69298 / r69295;
        return r69299;
}

double f(double x) {
        double r69300 = x;
        double r69301 = -0.00015927208545311257;
        bool r69302 = r69300 <= r69301;
        double r69303 = exp(r69300);
        double r69304 = 3.0;
        double r69305 = pow(r69303, r69304);
        double r69306 = 1.0;
        double r69307 = pow(r69306, r69304);
        double r69308 = r69305 - r69307;
        double r69309 = r69303 + r69306;
        double r69310 = r69306 * r69306;
        double r69311 = fma(r69303, r69309, r69310);
        double r69312 = r69308 / r69311;
        double r69313 = r69312 / r69300;
        double r69314 = r69300 * r69300;
        double r69315 = 0.16666666666666666;
        double r69316 = 0.5;
        double r69317 = fma(r69315, r69300, r69316);
        double r69318 = fma(r69314, r69317, r69300);
        double r69319 = r69318 / r69300;
        double r69320 = r69302 ? r69313 : r69319;
        return r69320;
}

Error

Bits error versus x

Target

Original40.0
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 < -0.00015927208545311257

    1. Initial program 0.0

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

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

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

    if -0.00015927208545311257 < x

    1. Initial program 60.3

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

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

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

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

Reproduce

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

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

  (/ (- (exp x) 1.0) x))