Average Error: 29.1 → 0.5
Time: 8.8s
Precision: 64
\[\frac{x}{x + 1} - \frac{x + 1}{x - 1}\]
\[\begin{array}{l} \mathbf{if}\;x \le -0.9868159492179903180542055451951455324888 \lor \neg \left(x \le 0.9975580681503711799607003740675281733274\right):\\ \;\;\;\;-\left(\left(\frac{1}{x \cdot x} + \frac{3}{x}\right) + \frac{3}{{x}^{3}}\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(1, x \cdot x, \mathsf{fma}\left(3, x, 1\right)\right)\\ \end{array}\]
\frac{x}{x + 1} - \frac{x + 1}{x - 1}
\begin{array}{l}
\mathbf{if}\;x \le -0.9868159492179903180542055451951455324888 \lor \neg \left(x \le 0.9975580681503711799607003740675281733274\right):\\
\;\;\;\;-\left(\left(\frac{1}{x \cdot x} + \frac{3}{x}\right) + \frac{3}{{x}^{3}}\right)\\

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

\end{array}
double f(double x) {
        double r126768 = x;
        double r126769 = 1.0;
        double r126770 = r126768 + r126769;
        double r126771 = r126768 / r126770;
        double r126772 = r126768 - r126769;
        double r126773 = r126770 / r126772;
        double r126774 = r126771 - r126773;
        return r126774;
}

double f(double x) {
        double r126775 = x;
        double r126776 = -0.9868159492179903;
        bool r126777 = r126775 <= r126776;
        double r126778 = 0.9975580681503712;
        bool r126779 = r126775 <= r126778;
        double r126780 = !r126779;
        bool r126781 = r126777 || r126780;
        double r126782 = 1.0;
        double r126783 = r126775 * r126775;
        double r126784 = r126782 / r126783;
        double r126785 = 3.0;
        double r126786 = r126785 / r126775;
        double r126787 = r126784 + r126786;
        double r126788 = 3.0;
        double r126789 = pow(r126775, r126788);
        double r126790 = r126785 / r126789;
        double r126791 = r126787 + r126790;
        double r126792 = -r126791;
        double r126793 = fma(r126785, r126775, r126782);
        double r126794 = fma(r126782, r126783, r126793);
        double r126795 = r126781 ? r126792 : r126794;
        return r126795;
}

Error

Bits error versus x

Derivation

  1. Split input into 2 regimes
  2. if x < -0.9868159492179903 or 0.9975580681503712 < x

    1. Initial program 58.6

      \[\frac{x}{x + 1} - \frac{x + 1}{x - 1}\]
    2. Taylor expanded around inf 0.7

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

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

    if -0.9868159492179903 < x < 0.9975580681503712

    1. Initial program 0.0

      \[\frac{x}{x + 1} - \frac{x + 1}{x - 1}\]
    2. Taylor expanded around 0 0.5

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le -0.9868159492179903180542055451951455324888 \lor \neg \left(x \le 0.9975580681503711799607003740675281733274\right):\\ \;\;\;\;-\left(\left(\frac{1}{x \cdot x} + \frac{3}{x}\right) + \frac{3}{{x}^{3}}\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(1, x \cdot x, \mathsf{fma}\left(3, x, 1\right)\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2019351 +o rules:numerics
(FPCore (x)
  :name "Asymptote C"
  :precision binary64
  (- (/ x (+ x 1)) (/ (+ x 1) (- x 1))))