Average Error: 53.4 → 0.1
Time: 10.6s
Precision: 64
\[\log \left(x + \sqrt{x \cdot x + 1}\right)\]
\[\begin{array}{l} \mathbf{if}\;x \le -1.020534956814445282091696753923315554857:\\ \;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.5}{x} + \frac{0.0625}{{x}^{5}}\right)\right)\\ \mathbf{elif}\;x \le 8.065403850916960659667154232010943815112 \cdot 10^{-4}:\\ \;\;\;\;\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(x + \sqrt{\mathsf{hypot}\left(x, \sqrt{1}\right)} \cdot \sqrt{\mathsf{hypot}\left(x, \sqrt{1}\right)}\right)\\ \end{array}\]
\log \left(x + \sqrt{x \cdot x + 1}\right)
\begin{array}{l}
\mathbf{if}\;x \le -1.020534956814445282091696753923315554857:\\
\;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.5}{x} + \frac{0.0625}{{x}^{5}}\right)\right)\\

\mathbf{elif}\;x \le 8.065403850916960659667154232010943815112 \cdot 10^{-4}:\\
\;\;\;\;\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(x + \sqrt{\mathsf{hypot}\left(x, \sqrt{1}\right)} \cdot \sqrt{\mathsf{hypot}\left(x, \sqrt{1}\right)}\right)\\

\end{array}
double f(double x) {
        double r105908 = x;
        double r105909 = r105908 * r105908;
        double r105910 = 1.0;
        double r105911 = r105909 + r105910;
        double r105912 = sqrt(r105911);
        double r105913 = r105908 + r105912;
        double r105914 = log(r105913);
        return r105914;
}

double f(double x) {
        double r105915 = x;
        double r105916 = -1.0205349568144453;
        bool r105917 = r105915 <= r105916;
        double r105918 = 0.125;
        double r105919 = 3.0;
        double r105920 = pow(r105915, r105919);
        double r105921 = r105918 / r105920;
        double r105922 = 0.5;
        double r105923 = r105922 / r105915;
        double r105924 = 0.0625;
        double r105925 = 5.0;
        double r105926 = pow(r105915, r105925);
        double r105927 = r105924 / r105926;
        double r105928 = r105923 + r105927;
        double r105929 = r105921 - r105928;
        double r105930 = log(r105929);
        double r105931 = 0.0008065403850916961;
        bool r105932 = r105915 <= r105931;
        double r105933 = 1.0;
        double r105934 = sqrt(r105933);
        double r105935 = pow(r105934, r105919);
        double r105936 = r105920 / r105935;
        double r105937 = -0.16666666666666666;
        double r105938 = log(r105934);
        double r105939 = r105915 / r105934;
        double r105940 = r105938 + r105939;
        double r105941 = fma(r105936, r105937, r105940);
        double r105942 = hypot(r105915, r105934);
        double r105943 = sqrt(r105942);
        double r105944 = r105943 * r105943;
        double r105945 = r105915 + r105944;
        double r105946 = log(r105945);
        double r105947 = r105932 ? r105941 : r105946;
        double r105948 = r105917 ? r105930 : r105947;
        return r105948;
}

Error

Bits error versus x

Target

Original53.4
Target45.7
Herbie0.1
\[\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.0205349568144453

    1. Initial program 63.1

      \[\log \left(x + \sqrt{x \cdot x + 1}\right)\]
    2. 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)}\]
    3. Simplified0.2

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

    if -1.0205349568144453 < x < 0.0008065403850916961

    1. Initial program 58.9

      \[\log \left(x + \sqrt{x \cdot x + 1}\right)\]
    2. Taylor expanded around 0 0.1

      \[\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}}}\]
    3. Simplified0.1

      \[\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.0008065403850916961 < x

    1. Initial program 32.2

      \[\log \left(x + \sqrt{x \cdot x + 1}\right)\]
    2. Using strategy rm
    3. Applied add-sqr-sqrt32.2

      \[\leadsto \log \left(x + \sqrt{x \cdot x + \color{blue}{\sqrt{1} \cdot \sqrt{1}}}\right)\]
    4. Applied hypot-def0.1

      \[\leadsto \log \left(x + \color{blue}{\mathsf{hypot}\left(x, \sqrt{1}\right)}\right)\]
    5. Using strategy rm
    6. Applied add-sqr-sqrt0.1

      \[\leadsto \log \left(x + \color{blue}{\sqrt{\mathsf{hypot}\left(x, \sqrt{1}\right)} \cdot \sqrt{\mathsf{hypot}\left(x, \sqrt{1}\right)}}\right)\]
  3. Recombined 3 regimes into one program.
  4. Final simplification0.1

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le -1.020534956814445282091696753923315554857:\\ \;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.5}{x} + \frac{0.0625}{{x}^{5}}\right)\right)\\ \mathbf{elif}\;x \le 8.065403850916960659667154232010943815112 \cdot 10^{-4}:\\ \;\;\;\;\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(x + \sqrt{\mathsf{hypot}\left(x, \sqrt{1}\right)} \cdot \sqrt{\mathsf{hypot}\left(x, \sqrt{1}\right)}\right)\\ \end{array}\]

Reproduce

herbie shell --seed 2019208 +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)))))