Average Error: 14.6 → 0.0
Time: 11.8s
Precision: 64
\[\frac{x}{x \cdot x + 1}\]
\[\begin{array}{l} \mathbf{if}\;x \le -3116.202715780454127525445073843002319336 \lor \neg \left(x \le 726.4607531112061451494810171425342559814\right):\\ \;\;\;\;\left(\frac{1}{x} - \frac{1}{{x}^{3}}\right) + \frac{1}{{x}^{5}}\\ \mathbf{else}:\\ \;\;\;\;\frac{1}{\sqrt{\mathsf{fma}\left(x, x, 1\right)}} \cdot \frac{x}{\sqrt{\mathsf{fma}\left(x, x, 1\right)}}\\ \end{array}\]
\frac{x}{x \cdot x + 1}
\begin{array}{l}
\mathbf{if}\;x \le -3116.202715780454127525445073843002319336 \lor \neg \left(x \le 726.4607531112061451494810171425342559814\right):\\
\;\;\;\;\left(\frac{1}{x} - \frac{1}{{x}^{3}}\right) + \frac{1}{{x}^{5}}\\

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

\end{array}
double f(double x) {
        double r47742 = x;
        double r47743 = r47742 * r47742;
        double r47744 = 1.0;
        double r47745 = r47743 + r47744;
        double r47746 = r47742 / r47745;
        return r47746;
}

double f(double x) {
        double r47747 = x;
        double r47748 = -3116.202715780454;
        bool r47749 = r47747 <= r47748;
        double r47750 = 726.4607531112061;
        bool r47751 = r47747 <= r47750;
        double r47752 = !r47751;
        bool r47753 = r47749 || r47752;
        double r47754 = 1.0;
        double r47755 = r47754 / r47747;
        double r47756 = 1.0;
        double r47757 = 3.0;
        double r47758 = pow(r47747, r47757);
        double r47759 = r47756 / r47758;
        double r47760 = r47755 - r47759;
        double r47761 = 5.0;
        double r47762 = pow(r47747, r47761);
        double r47763 = r47756 / r47762;
        double r47764 = r47760 + r47763;
        double r47765 = fma(r47747, r47747, r47756);
        double r47766 = sqrt(r47765);
        double r47767 = r47754 / r47766;
        double r47768 = r47747 / r47766;
        double r47769 = r47767 * r47768;
        double r47770 = r47753 ? r47764 : r47769;
        return r47770;
}

Error

Bits error versus x

Target

Original14.6
Target0.1
Herbie0.0
\[\frac{1}{x + \frac{1}{x}}\]

Derivation

  1. Split input into 2 regimes
  2. if x < -3116.202715780454 or 726.4607531112061 < x

    1. Initial program 29.5

      \[\frac{x}{x \cdot x + 1}\]
    2. Using strategy rm
    3. Applied clear-num29.4

      \[\leadsto \color{blue}{\frac{1}{\frac{x \cdot x + 1}{x}}}\]
    4. Simplified29.4

      \[\leadsto \frac{1}{\color{blue}{\frac{\mathsf{fma}\left(x, x, 1\right)}{x}}}\]
    5. Taylor expanded around inf 0.0

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

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

    if -3116.202715780454 < x < 726.4607531112061

    1. Initial program 0.0

      \[\frac{x}{x \cdot x + 1}\]
    2. Using strategy rm
    3. Applied add-sqr-sqrt0.0

      \[\leadsto \frac{x}{\color{blue}{\sqrt{x \cdot x + 1} \cdot \sqrt{x \cdot x + 1}}}\]
    4. Applied *-un-lft-identity0.0

      \[\leadsto \frac{\color{blue}{1 \cdot x}}{\sqrt{x \cdot x + 1} \cdot \sqrt{x \cdot x + 1}}\]
    5. Applied times-frac0.0

      \[\leadsto \color{blue}{\frac{1}{\sqrt{x \cdot x + 1}} \cdot \frac{x}{\sqrt{x \cdot x + 1}}}\]
    6. Simplified0.0

      \[\leadsto \color{blue}{\frac{1}{\sqrt{\mathsf{fma}\left(x, x, 1\right)}}} \cdot \frac{x}{\sqrt{x \cdot x + 1}}\]
    7. Simplified0.0

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

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

Reproduce

herbie shell --seed 2019194 +o rules:numerics
(FPCore (x)
  :name "x / (x^2 + 1)"

  :herbie-target
  (/ 1.0 (+ x (/ 1.0 x)))

  (/ x (+ (* x x) 1.0)))