Average Error: 53.1 → 0.2
Time: 15.4s
Precision: 64
\[\log \left(x + \sqrt{x \cdot x + 1}\right)\]
\[\begin{array}{l} \mathbf{if}\;x \le -1.002814715336328044159586170280817896128:\\ \;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.0625}{{x}^{5}} + \frac{0.5}{x}\right)\right)\\ \mathbf{elif}\;x \le 0.9017023301953626113203199565759859979153:\\ \;\;\;\;\mathsf{fma}\left(\frac{{x}^{3}}{{\left(\sqrt{1}\right)}^{3}}, \frac{-1}{6}, \log \left(\sqrt{1}\right) + \frac{x}{\sqrt{1}}\right)\\ \mathbf{else}:\\ \;\;\;\;\log \left(\mathsf{fma}\left(2, x, \frac{0.5}{x} - \frac{0.125}{{x}^{3}}\right)\right)\\ \end{array}\]
\log \left(x + \sqrt{x \cdot x + 1}\right)
\begin{array}{l}
\mathbf{if}\;x \le -1.002814715336328044159586170280817896128:\\
\;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.0625}{{x}^{5}} + \frac{0.5}{x}\right)\right)\\

\mathbf{elif}\;x \le 0.9017023301953626113203199565759859979153:\\
\;\;\;\;\mathsf{fma}\left(\frac{{x}^{3}}{{\left(\sqrt{1}\right)}^{3}}, \frac{-1}{6}, \log \left(\sqrt{1}\right) + \frac{x}{\sqrt{1}}\right)\\

\mathbf{else}:\\
\;\;\;\;\log \left(\mathsf{fma}\left(2, x, \frac{0.5}{x} - \frac{0.125}{{x}^{3}}\right)\right)\\

\end{array}
double f(double x) {
        double r129894 = x;
        double r129895 = r129894 * r129894;
        double r129896 = 1.0;
        double r129897 = r129895 + r129896;
        double r129898 = sqrt(r129897);
        double r129899 = r129894 + r129898;
        double r129900 = log(r129899);
        return r129900;
}

double f(double x) {
        double r129901 = x;
        double r129902 = -1.002814715336328;
        bool r129903 = r129901 <= r129902;
        double r129904 = 0.125;
        double r129905 = 3.0;
        double r129906 = pow(r129901, r129905);
        double r129907 = r129904 / r129906;
        double r129908 = 0.0625;
        double r129909 = 5.0;
        double r129910 = pow(r129901, r129909);
        double r129911 = r129908 / r129910;
        double r129912 = 0.5;
        double r129913 = r129912 / r129901;
        double r129914 = r129911 + r129913;
        double r129915 = r129907 - r129914;
        double r129916 = log(r129915);
        double r129917 = 0.9017023301953626;
        bool r129918 = r129901 <= r129917;
        double r129919 = 1.0;
        double r129920 = sqrt(r129919);
        double r129921 = pow(r129920, r129905);
        double r129922 = r129906 / r129921;
        double r129923 = -0.16666666666666666;
        double r129924 = log(r129920);
        double r129925 = r129901 / r129920;
        double r129926 = r129924 + r129925;
        double r129927 = fma(r129922, r129923, r129926);
        double r129928 = 2.0;
        double r129929 = r129913 - r129907;
        double r129930 = fma(r129928, r129901, r129929);
        double r129931 = log(r129930);
        double r129932 = r129918 ? r129927 : r129931;
        double r129933 = r129903 ? r129916 : r129932;
        return r129933;
}

Error

Bits error versus x

Target

Original53.1
Target45.2
Herbie0.2
\[\begin{array}{l} \mathbf{if}\;x \lt 0.0:\\ \;\;\;\;\log \left(\frac{-1}{x - \sqrt{x \cdot x + 1}}\right)\\ \mathbf{else}:\\ \;\;\;\;\log \left(x + \sqrt{x \cdot x + 1}\right)\\ \end{array}\]

Derivation

  1. Split input into 3 regimes
  2. if x < -1.002814715336328

    1. Initial program 63.1

      \[\log \left(x + \sqrt{x \cdot x + 1}\right)\]
    2. Simplified63.1

      \[\leadsto \color{blue}{\log \left(\sqrt{\mathsf{fma}\left(x, x, 1\right)} + x\right)}\]
    3. Taylor expanded around -inf 0.2

      \[\leadsto \log \color{blue}{\left(0.125 \cdot \frac{1}{{x}^{3}} - \left(0.5 \cdot \frac{1}{x} + 0.0625 \cdot \frac{1}{{x}^{5}}\right)\right)}\]
    4. Simplified0.2

      \[\leadsto \log \color{blue}{\left(\frac{0.125}{{x}^{3}} - \left(\frac{0.0625}{{x}^{5}} + \frac{0.5}{x}\right)\right)}\]

    if -1.002814715336328 < x < 0.9017023301953626

    1. Initial program 58.7

      \[\log \left(x + \sqrt{x \cdot x + 1}\right)\]
    2. Simplified58.7

      \[\leadsto \color{blue}{\log \left(\sqrt{\mathsf{fma}\left(x, x, 1\right)} + x\right)}\]
    3. Taylor expanded around 0 0.2

      \[\leadsto \color{blue}{\left(\log \left(\sqrt{1}\right) + \frac{x}{\sqrt{1}}\right) - \frac{1}{6} \cdot \frac{{x}^{3}}{{\left(\sqrt{1}\right)}^{3}}}\]
    4. Simplified0.2

      \[\leadsto \color{blue}{\mathsf{fma}\left(\frac{{x}^{3}}{{\left(\sqrt{1}\right)}^{3}}, \frac{-1}{6}, \log \left(\sqrt{1}\right) + \frac{x}{\sqrt{1}}\right)}\]

    if 0.9017023301953626 < x

    1. Initial program 32.2

      \[\log \left(x + \sqrt{x \cdot x + 1}\right)\]
    2. Simplified32.2

      \[\leadsto \color{blue}{\log \left(\sqrt{\mathsf{fma}\left(x, x, 1\right)} + x\right)}\]
    3. Taylor expanded around inf 0.1

      \[\leadsto \log \color{blue}{\left(\left(2 \cdot x + 0.5 \cdot \frac{1}{x}\right) - 0.125 \cdot \frac{1}{{x}^{3}}\right)}\]
    4. Simplified0.1

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le -1.002814715336328044159586170280817896128:\\ \;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.0625}{{x}^{5}} + \frac{0.5}{x}\right)\right)\\ \mathbf{elif}\;x \le 0.9017023301953626113203199565759859979153:\\ \;\;\;\;\mathsf{fma}\left(\frac{{x}^{3}}{{\left(\sqrt{1}\right)}^{3}}, \frac{-1}{6}, \log \left(\sqrt{1}\right) + \frac{x}{\sqrt{1}}\right)\\ \mathbf{else}:\\ \;\;\;\;\log \left(\mathsf{fma}\left(2, x, \frac{0.5}{x} - \frac{0.125}{{x}^{3}}\right)\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2019323 +o rules:numerics
(FPCore (x)
  :name "Hyperbolic arcsine"
  :precision binary64

  :herbie-target
  (if (< x 0.0) (log (/ -1 (- x (sqrt (+ (* x x) 1))))) (log (+ x (sqrt (+ (* x x) 1)))))

  (log (+ x (sqrt (+ (* x x) 1)))))