Average Error: 29.7 → 0.1
Time: 17.7s
Precision: 64
\[\frac{x}{x + 1} - \frac{x + 1}{x - 1}\]
\[\begin{array}{l} \mathbf{if}\;x \le -13754.17570154071472643408924341201782227 \lor \neg \left(x \le 11917.97074271185010729823261499404907227\right):\\ \;\;\;\;-\left(\left(\frac{1}{x \cdot x} + \frac{3}{x}\right) + \frac{3}{{x}^{3}}\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(x, \frac{1}{x + 1}, -\frac{x + 1}{x - 1}\right)\\ \end{array}\]
\frac{x}{x + 1} - \frac{x + 1}{x - 1}
\begin{array}{l}
\mathbf{if}\;x \le -13754.17570154071472643408924341201782227 \lor \neg \left(x \le 11917.97074271185010729823261499404907227\right):\\
\;\;\;\;-\left(\left(\frac{1}{x \cdot x} + \frac{3}{x}\right) + \frac{3}{{x}^{3}}\right)\\

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

\end{array}
double f(double x) {
        double r88868 = x;
        double r88869 = 1.0;
        double r88870 = r88868 + r88869;
        double r88871 = r88868 / r88870;
        double r88872 = r88868 - r88869;
        double r88873 = r88870 / r88872;
        double r88874 = r88871 - r88873;
        return r88874;
}

double f(double x) {
        double r88875 = x;
        double r88876 = -13754.175701540715;
        bool r88877 = r88875 <= r88876;
        double r88878 = 11917.97074271185;
        bool r88879 = r88875 <= r88878;
        double r88880 = !r88879;
        bool r88881 = r88877 || r88880;
        double r88882 = 1.0;
        double r88883 = r88875 * r88875;
        double r88884 = r88882 / r88883;
        double r88885 = 3.0;
        double r88886 = r88885 / r88875;
        double r88887 = r88884 + r88886;
        double r88888 = 3.0;
        double r88889 = pow(r88875, r88888);
        double r88890 = r88885 / r88889;
        double r88891 = r88887 + r88890;
        double r88892 = -r88891;
        double r88893 = 1.0;
        double r88894 = r88875 + r88882;
        double r88895 = r88893 / r88894;
        double r88896 = r88875 - r88882;
        double r88897 = r88894 / r88896;
        double r88898 = -r88897;
        double r88899 = fma(r88875, r88895, r88898);
        double r88900 = r88881 ? r88892 : r88899;
        return r88900;
}

Error

Bits error versus x

Derivation

  1. Split input into 2 regimes
  2. if x < -13754.175701540715 or 11917.97074271185 < x

    1. Initial program 59.3

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

      \[\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.0

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

    if -13754.175701540715 < x < 11917.97074271185

    1. Initial program 0.1

      \[\frac{x}{x + 1} - \frac{x + 1}{x - 1}\]
    2. Using strategy rm
    3. Applied div-inv0.1

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

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

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

Reproduce

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