Average Error: 9.5 → 0.3
Time: 10.7s
Precision: 64
\[\left(\frac{1}{x + 1} - \frac{2}{x}\right) + \frac{1}{x - 1}\]
\[\begin{array}{l} \mathbf{if}\;x \le -115.116316502083535 \lor \neg \left(x \le 120.64077220743235\right):\\ \;\;\;\;\frac{2}{{x}^{5}} + \left(\frac{2}{{x}^{3}} + \frac{2}{{x}^{7}}\right)\\ \mathbf{else}:\\ \;\;\;\;\mathsf{fma}\left(\frac{1}{x + 1}, \frac{1 \cdot x - \left(x + 1\right) \cdot 2}{x}, \frac{1}{x - 1}\right)\\ \end{array}\]
\left(\frac{1}{x + 1} - \frac{2}{x}\right) + \frac{1}{x - 1}
\begin{array}{l}
\mathbf{if}\;x \le -115.116316502083535 \lor \neg \left(x \le 120.64077220743235\right):\\
\;\;\;\;\frac{2}{{x}^{5}} + \left(\frac{2}{{x}^{3}} + \frac{2}{{x}^{7}}\right)\\

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

\end{array}
double f(double x) {
        double r130369 = 1.0;
        double r130370 = x;
        double r130371 = r130370 + r130369;
        double r130372 = r130369 / r130371;
        double r130373 = 2.0;
        double r130374 = r130373 / r130370;
        double r130375 = r130372 - r130374;
        double r130376 = r130370 - r130369;
        double r130377 = r130369 / r130376;
        double r130378 = r130375 + r130377;
        return r130378;
}

double f(double x) {
        double r130379 = x;
        double r130380 = -115.11631650208354;
        bool r130381 = r130379 <= r130380;
        double r130382 = 120.64077220743235;
        bool r130383 = r130379 <= r130382;
        double r130384 = !r130383;
        bool r130385 = r130381 || r130384;
        double r130386 = 2.0;
        double r130387 = 5.0;
        double r130388 = pow(r130379, r130387);
        double r130389 = r130386 / r130388;
        double r130390 = 3.0;
        double r130391 = pow(r130379, r130390);
        double r130392 = r130386 / r130391;
        double r130393 = 7.0;
        double r130394 = pow(r130379, r130393);
        double r130395 = r130386 / r130394;
        double r130396 = r130392 + r130395;
        double r130397 = r130389 + r130396;
        double r130398 = 1.0;
        double r130399 = 1.0;
        double r130400 = r130379 + r130399;
        double r130401 = r130398 / r130400;
        double r130402 = r130399 * r130379;
        double r130403 = r130400 * r130386;
        double r130404 = r130402 - r130403;
        double r130405 = r130404 / r130379;
        double r130406 = r130379 - r130399;
        double r130407 = r130399 / r130406;
        double r130408 = fma(r130401, r130405, r130407);
        double r130409 = r130385 ? r130397 : r130408;
        return r130409;
}

Error

Bits error versus x

Target

Original9.5
Target0.3
Herbie0.3
\[\frac{2}{x \cdot \left(x \cdot x - 1\right)}\]

Derivation

  1. Split input into 2 regimes
  2. if x < -115.11631650208354 or 120.64077220743235 < x

    1. Initial program 19.1

      \[\left(\frac{1}{x + 1} - \frac{2}{x}\right) + \frac{1}{x - 1}\]
    2. Using strategy rm
    3. Applied frac-sub52.0

      \[\leadsto \color{blue}{\frac{1 \cdot x - \left(x + 1\right) \cdot 2}{\left(x + 1\right) \cdot x}} + \frac{1}{x - 1}\]
    4. Taylor expanded around inf 0.5

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

      \[\leadsto \color{blue}{\frac{2}{{x}^{5}} + \left(\frac{2}{{x}^{3}} + \frac{2}{{x}^{7}}\right)}\]

    if -115.11631650208354 < x < 120.64077220743235

    1. Initial program 0.0

      \[\left(\frac{1}{x + 1} - \frac{2}{x}\right) + \frac{1}{x - 1}\]
    2. Using strategy rm
    3. Applied frac-sub0.0

      \[\leadsto \color{blue}{\frac{1 \cdot x - \left(x + 1\right) \cdot 2}{\left(x + 1\right) \cdot x}} + \frac{1}{x - 1}\]
    4. Using strategy rm
    5. Applied *-un-lft-identity0.0

      \[\leadsto \frac{\color{blue}{1 \cdot \left(1 \cdot x - \left(x + 1\right) \cdot 2\right)}}{\left(x + 1\right) \cdot x} + \frac{1}{x - 1}\]
    6. Applied times-frac0.1

      \[\leadsto \color{blue}{\frac{1}{x + 1} \cdot \frac{1 \cdot x - \left(x + 1\right) \cdot 2}{x}} + \frac{1}{x - 1}\]
    7. Applied fma-def0.0

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

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

Reproduce

herbie shell --seed 2020047 +o rules:numerics
(FPCore (x)
  :name "3frac (problem 3.3.3)"
  :precision binary64

  :herbie-target
  (/ 2 (* x (- (* x x) 1)))

  (+ (- (/ 1 (+ x 1)) (/ 2 x)) (/ 1 (- x 1))))