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

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

\end{array}
double f(double x) {
        double r59868 = x;
        double r59869 = r59868 * r59868;
        double r59870 = 1.0;
        double r59871 = r59869 + r59870;
        double r59872 = r59868 / r59871;
        return r59872;
}

double f(double x) {
        double r59873 = x;
        double r59874 = -542649.7982661554;
        bool r59875 = r59873 <= r59874;
        double r59876 = 904431.5607004879;
        bool r59877 = r59873 <= r59876;
        double r59878 = !r59877;
        bool r59879 = r59875 || r59878;
        double r59880 = 1.0;
        double r59881 = 1.0;
        double r59882 = 5.0;
        double r59883 = pow(r59873, r59882);
        double r59884 = r59881 / r59883;
        double r59885 = 3.0;
        double r59886 = pow(r59873, r59885);
        double r59887 = r59881 / r59886;
        double r59888 = r59884 - r59887;
        double r59889 = r59881 / r59873;
        double r59890 = fma(r59880, r59888, r59889);
        double r59891 = -r59880;
        double r59892 = 4.0;
        double r59893 = pow(r59873, r59892);
        double r59894 = fma(r59891, r59880, r59893);
        double r59895 = r59873 / r59894;
        double r59896 = r59873 * r59873;
        double r59897 = r59896 - r59880;
        double r59898 = r59895 * r59897;
        double r59899 = r59879 ? r59890 : r59898;
        return r59899;
}

Error

Bits error versus x

Target

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

Derivation

  1. Split input into 2 regimes
  2. if x < -542649.7982661554 or 904431.5607004879 < x

    1. Initial program 31.3

      \[\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}{\mathsf{fma}\left(1, \frac{1}{{x}^{5}} - \frac{1}{{x}^{3}}, \frac{1}{x}\right)}\]

    if -542649.7982661554 < x < 904431.5607004879

    1. Initial program 0.0

      \[\frac{x}{x \cdot x + 1}\]
    2. Using strategy rm
    3. Applied flip-+0.0

      \[\leadsto \frac{x}{\color{blue}{\frac{\left(x \cdot x\right) \cdot \left(x \cdot x\right) - 1 \cdot 1}{x \cdot x - 1}}}\]
    4. Applied associate-/r/0.0

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

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

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

Reproduce

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

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

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