Average Error: 14.4 → 0.1
Time: 19.2s
Precision: 64
\[\frac{1}{x + 1} - \frac{1}{x - 1}\]
\[\begin{array}{l} \mathbf{if}\;x \le -217.646331775989779089286457747220993042:\\ \;\;\;\;-\left(\frac{2}{\left(\left(x \cdot x\right) \cdot x\right) \cdot \left(\left(x \cdot x\right) \cdot x\right)} + \left(\frac{\frac{2}{x}}{x} + \frac{2}{\left(x \cdot x\right) \cdot \left(x \cdot x\right)}\right)\right)\\ \mathbf{elif}\;x \le 210.2059788759916614253597799688577651978:\\ \;\;\;\;\mathsf{fma}\left(\frac{1}{{1}^{3} + {x}^{3}}, x \cdot x + \left(1 \cdot 1 - x \cdot 1\right), \frac{-1}{x - 1}\right)\\ \mathbf{else}:\\ \;\;\;\;-\left(\frac{2}{\left(\left(x \cdot x\right) \cdot x\right) \cdot \left(\left(x \cdot x\right) \cdot x\right)} + \left(\frac{\frac{2}{x}}{x} + \frac{2}{\left(x \cdot x\right) \cdot \left(x \cdot x\right)}\right)\right)\\ \end{array}\]
\frac{1}{x + 1} - \frac{1}{x - 1}
\begin{array}{l}
\mathbf{if}\;x \le -217.646331775989779089286457747220993042:\\
\;\;\;\;-\left(\frac{2}{\left(\left(x \cdot x\right) \cdot x\right) \cdot \left(\left(x \cdot x\right) \cdot x\right)} + \left(\frac{\frac{2}{x}}{x} + \frac{2}{\left(x \cdot x\right) \cdot \left(x \cdot x\right)}\right)\right)\\

\mathbf{elif}\;x \le 210.2059788759916614253597799688577651978:\\
\;\;\;\;\mathsf{fma}\left(\frac{1}{{1}^{3} + {x}^{3}}, x \cdot x + \left(1 \cdot 1 - x \cdot 1\right), \frac{-1}{x - 1}\right)\\

\mathbf{else}:\\
\;\;\;\;-\left(\frac{2}{\left(\left(x \cdot x\right) \cdot x\right) \cdot \left(\left(x \cdot x\right) \cdot x\right)} + \left(\frac{\frac{2}{x}}{x} + \frac{2}{\left(x \cdot x\right) \cdot \left(x \cdot x\right)}\right)\right)\\

\end{array}
double f(double x) {
        double r4686603 = 1.0;
        double r4686604 = x;
        double r4686605 = r4686604 + r4686603;
        double r4686606 = r4686603 / r4686605;
        double r4686607 = r4686604 - r4686603;
        double r4686608 = r4686603 / r4686607;
        double r4686609 = r4686606 - r4686608;
        return r4686609;
}

double f(double x) {
        double r4686610 = x;
        double r4686611 = -217.64633177598978;
        bool r4686612 = r4686610 <= r4686611;
        double r4686613 = 2.0;
        double r4686614 = r4686610 * r4686610;
        double r4686615 = r4686614 * r4686610;
        double r4686616 = r4686615 * r4686615;
        double r4686617 = r4686613 / r4686616;
        double r4686618 = r4686613 / r4686610;
        double r4686619 = r4686618 / r4686610;
        double r4686620 = r4686614 * r4686614;
        double r4686621 = r4686613 / r4686620;
        double r4686622 = r4686619 + r4686621;
        double r4686623 = r4686617 + r4686622;
        double r4686624 = -r4686623;
        double r4686625 = 210.20597887599166;
        bool r4686626 = r4686610 <= r4686625;
        double r4686627 = 1.0;
        double r4686628 = 3.0;
        double r4686629 = pow(r4686627, r4686628);
        double r4686630 = pow(r4686610, r4686628);
        double r4686631 = r4686629 + r4686630;
        double r4686632 = r4686627 / r4686631;
        double r4686633 = r4686627 * r4686627;
        double r4686634 = r4686610 * r4686627;
        double r4686635 = r4686633 - r4686634;
        double r4686636 = r4686614 + r4686635;
        double r4686637 = -r4686627;
        double r4686638 = r4686610 - r4686627;
        double r4686639 = r4686637 / r4686638;
        double r4686640 = fma(r4686632, r4686636, r4686639);
        double r4686641 = r4686626 ? r4686640 : r4686624;
        double r4686642 = r4686612 ? r4686624 : r4686641;
        return r4686642;
}

Error

Bits error versus x

Derivation

  1. Split input into 2 regimes
  2. if x < -217.64633177598978 or 210.20597887599166 < x

    1. Initial program 28.9

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

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

      \[\leadsto \color{blue}{-\left(\left(\frac{2}{\left(x \cdot x\right) \cdot \left(x \cdot x\right)} + \frac{2}{x \cdot x}\right) + \frac{2}{\left(\left(x \cdot x\right) \cdot x\right) \cdot \left(\left(x \cdot x\right) \cdot x\right)}\right)}\]
    4. Using strategy rm
    5. Applied associate-/r*0.1

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

    if -217.64633177598978 < x < 210.20597887599166

    1. Initial program 0.0

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

      \[\leadsto \frac{1}{\color{blue}{\frac{{x}^{3} + {1}^{3}}{x \cdot x + \left(1 \cdot 1 - x \cdot 1\right)}}} - \frac{1}{x - 1}\]
    4. Applied associate-/r/0.0

      \[\leadsto \color{blue}{\frac{1}{{x}^{3} + {1}^{3}} \cdot \left(x \cdot x + \left(1 \cdot 1 - x \cdot 1\right)\right)} - \frac{1}{x - 1}\]
    5. Applied fma-neg0.0

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le -217.646331775989779089286457747220993042:\\ \;\;\;\;-\left(\frac{2}{\left(\left(x \cdot x\right) \cdot x\right) \cdot \left(\left(x \cdot x\right) \cdot x\right)} + \left(\frac{\frac{2}{x}}{x} + \frac{2}{\left(x \cdot x\right) \cdot \left(x \cdot x\right)}\right)\right)\\ \mathbf{elif}\;x \le 210.2059788759916614253597799688577651978:\\ \;\;\;\;\mathsf{fma}\left(\frac{1}{{1}^{3} + {x}^{3}}, x \cdot x + \left(1 \cdot 1 - x \cdot 1\right), \frac{-1}{x - 1}\right)\\ \mathbf{else}:\\ \;\;\;\;-\left(\frac{2}{\left(\left(x \cdot x\right) \cdot x\right) \cdot \left(\left(x \cdot x\right) \cdot x\right)} + \left(\frac{\frac{2}{x}}{x} + \frac{2}{\left(x \cdot x\right) \cdot \left(x \cdot x\right)}\right)\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2019171 +o rules:numerics
(FPCore (x)
  :name "Asymptote A"
  (- (/ 1.0 (+ x 1.0)) (/ 1.0 (- x 1.0))))