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

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

\end{array}
double f(double x) {
        double r58588 = x;
        double r58589 = r58588 * r58588;
        double r58590 = 1.0;
        double r58591 = r58589 + r58590;
        double r58592 = r58588 / r58591;
        return r58592;
}

double f(double x) {
        double r58593 = x;
        double r58594 = -1.3440694370491086e+154;
        bool r58595 = r58593 <= r58594;
        double r58596 = 742.6193916240435;
        bool r58597 = r58593 <= r58596;
        double r58598 = !r58597;
        bool r58599 = r58595 || r58598;
        double r58600 = 1.0;
        double r58601 = r58600 / r58593;
        double r58602 = 1.0;
        double r58603 = 3.0;
        double r58604 = pow(r58593, r58603);
        double r58605 = r58602 / r58604;
        double r58606 = r58601 - r58605;
        double r58607 = 5.0;
        double r58608 = pow(r58593, r58607);
        double r58609 = r58602 / r58608;
        double r58610 = r58606 + r58609;
        double r58611 = fma(r58593, r58593, r58602);
        double r58612 = sqrt(r58611);
        double r58613 = r58593 / r58612;
        double r58614 = r58613 / r58612;
        double r58615 = r58599 ? r58610 : r58614;
        return r58615;
}

Error

Bits error versus x

Target

Original15.3
Target0.1
Herbie0.0
\[\frac{1}{x + \frac{1}{x}}\]

Derivation

  1. Split input into 2 regimes
  2. if x < -1.3440694370491086e+154 or 742.6193916240435 < x

    1. Initial program 39.8

      \[\frac{x}{x \cdot x + 1}\]
    2. Simplified39.8

      \[\leadsto \color{blue}{\frac{x}{\mathsf{fma}\left(x, x, 1\right)}}\]
    3. Using strategy rm
    4. Applied add-sqr-sqrt39.8

      \[\leadsto \frac{x}{\color{blue}{\sqrt{\mathsf{fma}\left(x, x, 1\right)} \cdot \sqrt{\mathsf{fma}\left(x, x, 1\right)}}}\]
    5. Applied associate-/r*39.7

      \[\leadsto \color{blue}{\frac{\frac{x}{\sqrt{\mathsf{fma}\left(x, x, 1\right)}}}{\sqrt{\mathsf{fma}\left(x, x, 1\right)}}}\]
    6. 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}}}\]
    7. Simplified0.0

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

    if -1.3440694370491086e+154 < x < 742.6193916240435

    1. Initial program 0.1

      \[\frac{x}{x \cdot x + 1}\]
    2. Simplified0.1

      \[\leadsto \color{blue}{\frac{x}{\mathsf{fma}\left(x, x, 1\right)}}\]
    3. Using strategy rm
    4. Applied add-sqr-sqrt0.1

      \[\leadsto \frac{x}{\color{blue}{\sqrt{\mathsf{fma}\left(x, x, 1\right)} \cdot \sqrt{\mathsf{fma}\left(x, x, 1\right)}}}\]
    5. Applied associate-/r*0.0

      \[\leadsto \color{blue}{\frac{\frac{x}{\sqrt{\mathsf{fma}\left(x, x, 1\right)}}}{\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 -1.34406943704910861 \cdot 10^{154} \lor \neg \left(x \le 742.619391624043487\right):\\ \;\;\;\;\left(\frac{1}{x} - \frac{1}{{x}^{3}}\right) + \frac{1}{{x}^{5}}\\ \mathbf{else}:\\ \;\;\;\;\frac{\frac{x}{\sqrt{\mathsf{fma}\left(x, x, 1\right)}}}{\sqrt{\mathsf{fma}\left(x, x, 1\right)}}\\ \end{array}\]

Reproduce

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

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

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