Average Error: 40.9 → 0.8
Time: 2.9s
Precision: 64
\[\frac{e^{x}}{e^{x} - 1}\]
\[\begin{array}{l} \mathbf{if}\;e^{x} \le 2.32657494077244701 \cdot 10^{-52}:\\ \;\;\;\;\frac{e^{x}}{\mathsf{fma}\left(\sqrt{\sqrt{e^{x}}} \cdot \sqrt{\sqrt{e^{x}}}, \sqrt{e^{x}}, -1\right)}\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(\frac{1}{12}, x, \frac{1}{x}\right) + \frac{1}{2}\\ \end{array}\]
\frac{e^{x}}{e^{x} - 1}
\begin{array}{l}
\mathbf{if}\;e^{x} \le 2.32657494077244701 \cdot 10^{-52}:\\
\;\;\;\;\frac{e^{x}}{\mathsf{fma}\left(\sqrt{\sqrt{e^{x}}} \cdot \sqrt{\sqrt{e^{x}}}, \sqrt{e^{x}}, -1\right)}\\

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

\end{array}
double f(double x) {
        double r168802 = x;
        double r168803 = exp(r168802);
        double r168804 = 1.0;
        double r168805 = r168803 - r168804;
        double r168806 = r168803 / r168805;
        return r168806;
}

double f(double x) {
        double r168807 = x;
        double r168808 = exp(r168807);
        double r168809 = 2.326574940772447e-52;
        bool r168810 = r168808 <= r168809;
        double r168811 = sqrt(r168808);
        double r168812 = sqrt(r168811);
        double r168813 = r168812 * r168812;
        double r168814 = 1.0;
        double r168815 = -r168814;
        double r168816 = fma(r168813, r168811, r168815);
        double r168817 = r168808 / r168816;
        double r168818 = 0.08333333333333333;
        double r168819 = 1.0;
        double r168820 = r168819 / r168807;
        double r168821 = fma(r168818, r168807, r168820);
        double r168822 = 0.5;
        double r168823 = r168821 + r168822;
        double r168824 = r168810 ? r168817 : r168823;
        return r168824;
}

Error

Bits error versus x

Target

Original40.9
Target40.4
Herbie0.8
\[\frac{1}{1 - e^{-x}}\]

Derivation

  1. Split input into 2 regimes
  2. if (exp x) < 2.326574940772447e-52

    1. Initial program 0

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

      \[\leadsto \frac{e^{x}}{\color{blue}{\sqrt{e^{x}} \cdot \sqrt{e^{x}}} - 1}\]
    4. Applied fma-neg0

      \[\leadsto \frac{e^{x}}{\color{blue}{\mathsf{fma}\left(\sqrt{e^{x}}, \sqrt{e^{x}}, -1\right)}}\]
    5. Using strategy rm
    6. Applied add-sqr-sqrt0

      \[\leadsto \frac{e^{x}}{\mathsf{fma}\left(\sqrt{\color{blue}{\sqrt{e^{x}} \cdot \sqrt{e^{x}}}}, \sqrt{e^{x}}, -1\right)}\]
    7. Applied sqrt-prod0

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

    if 2.326574940772447e-52 < (exp x)

    1. Initial program 61.5

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

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

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

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

Reproduce

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

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

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