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

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

\end{array}
double f(double x) {
        double r110138 = x;
        double r110139 = r110138 * r110138;
        double r110140 = 1.0;
        double r110141 = r110139 + r110140;
        double r110142 = r110138 / r110141;
        return r110142;
}

double f(double x) {
        double r110143 = x;
        double r110144 = -62379821099783.21;
        bool r110145 = r110143 <= r110144;
        double r110146 = 2168.5227801871383;
        bool r110147 = r110143 <= r110146;
        double r110148 = !r110147;
        bool r110149 = r110145 || r110148;
        double r110150 = 1.0;
        double r110151 = r110150 / r110143;
        double r110152 = 1.0;
        double r110153 = 5.0;
        double r110154 = pow(r110143, r110153);
        double r110155 = r110152 / r110154;
        double r110156 = r110151 + r110155;
        double r110157 = 3.0;
        double r110158 = pow(r110143, r110157);
        double r110159 = r110152 / r110158;
        double r110160 = r110156 - r110159;
        double r110161 = fma(r110143, r110143, r110152);
        double r110162 = r110150 / r110161;
        double r110163 = r110143 * r110162;
        double r110164 = r110149 ? r110160 : r110163;
        return r110164;
}

Error

Bits error versus x

Target

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

Derivation

  1. Split input into 2 regimes
  2. if x < -62379821099783.21 or 2168.5227801871383 < x

    1. Initial program 30.9

      \[\frac{x}{x \cdot x + 1}\]
    2. 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}}}\]
    3. Simplified0.0

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

    if -62379821099783.21 < x < 2168.5227801871383

    1. Initial program 0.0

      \[\frac{x}{x \cdot x + 1}\]
    2. Using strategy rm
    3. Applied div-inv0.0

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

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

Reproduce

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

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

  (/ x (+ (* x x) 1)))