Average Error: 29.5 → 0.1
Time: 5.6s
Precision: 64
\[\frac{x}{x + 1} - \frac{x + 1}{x - 1}\]
\[\begin{array}{l} \mathbf{if}\;x \le -12526.87883169779706804547458887100219727 \lor \neg \left(x \le 12009.41967600402495008893311023712158203\right):\\ \;\;\;\;\frac{-1}{{x}^{2}} - \left(\frac{3}{x} + 3 \cdot \frac{1}{{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 -12526.87883169779706804547458887100219727 \lor \neg \left(x \le 12009.41967600402495008893311023712158203\right):\\
\;\;\;\;\frac{-1}{{x}^{2}} - \left(\frac{3}{x} + 3 \cdot \frac{1}{{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 r157160 = x;
        double r157161 = 1.0;
        double r157162 = r157160 + r157161;
        double r157163 = r157160 / r157162;
        double r157164 = r157160 - r157161;
        double r157165 = r157162 / r157164;
        double r157166 = r157163 - r157165;
        return r157166;
}

double f(double x) {
        double r157167 = x;
        double r157168 = -12526.878831697797;
        bool r157169 = r157167 <= r157168;
        double r157170 = 12009.419676004025;
        bool r157171 = r157167 <= r157170;
        double r157172 = !r157171;
        bool r157173 = r157169 || r157172;
        double r157174 = 1.0;
        double r157175 = -r157174;
        double r157176 = 2.0;
        double r157177 = pow(r157167, r157176);
        double r157178 = r157175 / r157177;
        double r157179 = 3.0;
        double r157180 = r157179 / r157167;
        double r157181 = 1.0;
        double r157182 = 3.0;
        double r157183 = pow(r157167, r157182);
        double r157184 = r157181 / r157183;
        double r157185 = r157179 * r157184;
        double r157186 = r157180 + r157185;
        double r157187 = r157178 - r157186;
        double r157188 = r157167 + r157174;
        double r157189 = r157181 / r157188;
        double r157190 = r157167 - r157174;
        double r157191 = r157188 / r157190;
        double r157192 = -r157191;
        double r157193 = fma(r157167, r157189, r157192);
        double r157194 = r157173 ? r157187 : r157193;
        return r157194;
}

Error

Bits error versus x

Derivation

  1. Split input into 2 regimes
  2. if x < -12526.878831697797 or 12009.419676004025 < 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.3

      \[\leadsto \color{blue}{\frac{-1}{{x}^{2}} - \mathsf{fma}\left(3, \frac{1}{x}, 3 \cdot \frac{1}{{x}^{3}}\right)}\]
    4. Using strategy rm
    5. Applied fma-udef0.3

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

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

    if -12526.878831697797 < x < 12009.419676004025

    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 -12526.87883169779706804547458887100219727 \lor \neg \left(x \le 12009.41967600402495008893311023712158203\right):\\ \;\;\;\;\frac{-1}{{x}^{2}} - \left(\frac{3}{x} + 3 \cdot \frac{1}{{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 2019353 +o rules:numerics
(FPCore (x)
  :name "Asymptote C"
  :precision binary64
  (- (/ x (+ x 1)) (/ (+ x 1) (- x 1))))