Average Error: 40.1 → 0.5
Time: 24.9s
Precision: 64
\[\frac{e^{x}}{e^{x} - 1}\]
\[\begin{array}{l} \mathbf{if}\;x \le -2.036719815602951 \cdot 10^{-07}:\\ \;\;\;\;\sqrt[3]{\frac{e^{x}}{(e^{x} - 1)^*} \cdot \left(\frac{e^{x}}{(e^{x} - 1)^*} \cdot \frac{e^{x}}{(e^{x} - 1)^*}\right)}\\ \mathbf{else}:\\ \;\;\;\;(x \cdot \frac{1}{12} + \left(\frac{1}{x} + \frac{1}{2}\right))_*\\ \end{array}\]
\frac{e^{x}}{e^{x} - 1}
\begin{array}{l}
\mathbf{if}\;x \le -2.036719815602951 \cdot 10^{-07}:\\
\;\;\;\;\sqrt[3]{\frac{e^{x}}{(e^{x} - 1)^*} \cdot \left(\frac{e^{x}}{(e^{x} - 1)^*} \cdot \frac{e^{x}}{(e^{x} - 1)^*}\right)}\\

\mathbf{else}:\\
\;\;\;\;(x \cdot \frac{1}{12} + \left(\frac{1}{x} + \frac{1}{2}\right))_*\\

\end{array}
double f(double x) {
        double r5164008 = x;
        double r5164009 = exp(r5164008);
        double r5164010 = 1.0;
        double r5164011 = r5164009 - r5164010;
        double r5164012 = r5164009 / r5164011;
        return r5164012;
}

double f(double x) {
        double r5164013 = x;
        double r5164014 = -2.036719815602951e-07;
        bool r5164015 = r5164013 <= r5164014;
        double r5164016 = exp(r5164013);
        double r5164017 = expm1(r5164013);
        double r5164018 = r5164016 / r5164017;
        double r5164019 = r5164018 * r5164018;
        double r5164020 = r5164018 * r5164019;
        double r5164021 = cbrt(r5164020);
        double r5164022 = 0.08333333333333333;
        double r5164023 = 1.0;
        double r5164024 = r5164023 / r5164013;
        double r5164025 = 0.5;
        double r5164026 = r5164024 + r5164025;
        double r5164027 = fma(r5164013, r5164022, r5164026);
        double r5164028 = r5164015 ? r5164021 : r5164027;
        return r5164028;
}

Error

Bits error versus x

Target

Original40.1
Target39.8
Herbie0.5
\[\frac{1}{1 - e^{-x}}\]

Derivation

  1. Split input into 2 regimes
  2. if x < -2.036719815602951e-07

    1. Initial program 0.2

      \[\frac{e^{x}}{e^{x} - 1}\]
    2. Using strategy rm
    3. Applied add-cbrt-cube0.2

      \[\leadsto \frac{e^{x}}{\color{blue}{\sqrt[3]{\left(\left(e^{x} - 1\right) \cdot \left(e^{x} - 1\right)\right) \cdot \left(e^{x} - 1\right)}}}\]
    4. Applied add-cbrt-cube0.3

      \[\leadsto \frac{\color{blue}{\sqrt[3]{\left(e^{x} \cdot e^{x}\right) \cdot e^{x}}}}{\sqrt[3]{\left(\left(e^{x} - 1\right) \cdot \left(e^{x} - 1\right)\right) \cdot \left(e^{x} - 1\right)}}\]
    5. Applied cbrt-undiv0.3

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

      \[\leadsto \sqrt[3]{\color{blue}{\frac{e^{x}}{(e^{x} - 1)^*} \cdot \left(\frac{e^{x}}{(e^{x} - 1)^*} \cdot \frac{e^{x}}{(e^{x} - 1)^*}\right)}}\]

    if -2.036719815602951e-07 < x

    1. Initial program 60.4

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

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

      \[\leadsto \color{blue}{(x \cdot \frac{1}{12} + \left(\frac{1}{2} + \frac{1}{x}\right))_*}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification0.5

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le -2.036719815602951 \cdot 10^{-07}:\\ \;\;\;\;\sqrt[3]{\frac{e^{x}}{(e^{x} - 1)^*} \cdot \left(\frac{e^{x}}{(e^{x} - 1)^*} \cdot \frac{e^{x}}{(e^{x} - 1)^*}\right)}\\ \mathbf{else}:\\ \;\;\;\;(x \cdot \frac{1}{12} + \left(\frac{1}{x} + \frac{1}{2}\right))_*\\ \end{array}\]

Reproduce

herbie shell --seed 2019104 +o rules:numerics
(FPCore (x)
  :name "expq2 (section 3.11)"

  :herbie-target
  (/ 1 (- 1 (exp (- x))))

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