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

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

\end{array}
double f(double x) {
        double r48111 = x;
        double r48112 = r48111 * r48111;
        double r48113 = 1.0;
        double r48114 = r48112 + r48113;
        double r48115 = r48111 / r48114;
        return r48115;
}

double f(double x) {
        double r48116 = x;
        double r48117 = -5.71370680105489e+22;
        bool r48118 = r48116 <= r48117;
        double r48119 = 8124.998191315609;
        bool r48120 = r48116 <= r48119;
        double r48121 = !r48120;
        bool r48122 = r48118 || r48121;
        double r48123 = 1.0;
        double r48124 = 5.0;
        double r48125 = pow(r48116, r48124);
        double r48126 = r48123 / r48125;
        double r48127 = 3.0;
        double r48128 = pow(r48116, r48127);
        double r48129 = r48123 / r48128;
        double r48130 = r48126 - r48129;
        double r48131 = 1.0;
        double r48132 = r48131 / r48116;
        double r48133 = r48130 + r48132;
        double r48134 = fma(r48116, r48116, r48123);
        double r48135 = r48116 / r48134;
        double r48136 = r48122 ? r48133 : r48135;
        return r48136;
}

Error

Bits error versus x

Target

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

Derivation

  1. Split input into 2 regimes
  2. if x < -5.71370680105489e+22 or 8124.998191315609 < x

    1. Initial program 30.6

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

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

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

    if -5.71370680105489e+22 < x < 8124.998191315609

    1. Initial program 0.0

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

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

Reproduce

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

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

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