Average Error: 53.3 → 0.2
Time: 5.8s
Precision: 64
\[\log \left(x + \sqrt{x \cdot x + 1}\right)\]
\[\begin{array}{l} \mathbf{if}\;x \le -1.02867483106351787:\\ \;\;\;\;\log \left(\mathsf{fma}\left(\frac{\frac{1}{8}}{{x}^{3}}, 1 \cdot 1, \left(-\frac{1}{2}\right) \cdot \frac{1}{x} - \frac{{1}^{3}}{\frac{{x}^{5}}{\frac{1}{16}}}\right)\right)\\ \mathbf{elif}\;x \le 9.30222189011167149 \cdot 10^{-4}:\\ \;\;\;\;\left(\log \left(\sqrt{1}\right) + \frac{x}{\sqrt{1}}\right) - \frac{1}{6} \cdot \frac{{x}^{3}}{{\left(\sqrt{1}\right)}^{3}}\\ \mathbf{else}:\\ \;\;\;\;\log \left(\mathsf{hypot}\left(x, \sqrt{1}\right) + x\right)\\ \end{array}\]
\log \left(x + \sqrt{x \cdot x + 1}\right)
\begin{array}{l}
\mathbf{if}\;x \le -1.02867483106351787:\\
\;\;\;\;\log \left(\mathsf{fma}\left(\frac{\frac{1}{8}}{{x}^{3}}, 1 \cdot 1, \left(-\frac{1}{2}\right) \cdot \frac{1}{x} - \frac{{1}^{3}}{\frac{{x}^{5}}{\frac{1}{16}}}\right)\right)\\

\mathbf{elif}\;x \le 9.30222189011167149 \cdot 10^{-4}:\\
\;\;\;\;\left(\log \left(\sqrt{1}\right) + \frac{x}{\sqrt{1}}\right) - \frac{1}{6} \cdot \frac{{x}^{3}}{{\left(\sqrt{1}\right)}^{3}}\\

\mathbf{else}:\\
\;\;\;\;\log \left(\mathsf{hypot}\left(x, \sqrt{1}\right) + x\right)\\

\end{array}
double f(double x) {
        double r185201 = x;
        double r185202 = r185201 * r185201;
        double r185203 = 1.0;
        double r185204 = r185202 + r185203;
        double r185205 = sqrt(r185204);
        double r185206 = r185201 + r185205;
        double r185207 = log(r185206);
        return r185207;
}

double f(double x) {
        double r185208 = x;
        double r185209 = -1.0286748310635179;
        bool r185210 = r185208 <= r185209;
        double r185211 = 0.125;
        double r185212 = 3.0;
        double r185213 = pow(r185208, r185212);
        double r185214 = r185211 / r185213;
        double r185215 = 1.0;
        double r185216 = r185215 * r185215;
        double r185217 = 0.5;
        double r185218 = -r185217;
        double r185219 = r185215 / r185208;
        double r185220 = r185218 * r185219;
        double r185221 = pow(r185215, r185212);
        double r185222 = 5.0;
        double r185223 = pow(r185208, r185222);
        double r185224 = 0.0625;
        double r185225 = r185223 / r185224;
        double r185226 = r185221 / r185225;
        double r185227 = r185220 - r185226;
        double r185228 = fma(r185214, r185216, r185227);
        double r185229 = log(r185228);
        double r185230 = 0.0009302221890111671;
        bool r185231 = r185208 <= r185230;
        double r185232 = sqrt(r185215);
        double r185233 = log(r185232);
        double r185234 = r185208 / r185232;
        double r185235 = r185233 + r185234;
        double r185236 = 0.16666666666666666;
        double r185237 = pow(r185232, r185212);
        double r185238 = r185213 / r185237;
        double r185239 = r185236 * r185238;
        double r185240 = r185235 - r185239;
        double r185241 = hypot(r185208, r185232);
        double r185242 = r185241 + r185208;
        double r185243 = log(r185242);
        double r185244 = r185231 ? r185240 : r185243;
        double r185245 = r185210 ? r185229 : r185244;
        return r185245;
}

Error

Bits error versus x

Target

Original53.3
Target45.6
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.0286748310635179

    1. Initial program 63.0

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

      \[\leadsto \color{blue}{\log \left(e^{\log \left(x + \sqrt{x \cdot x + 1}\right)}\right)}\]
    4. Simplified63.0

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

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

      \[\leadsto \log \color{blue}{\left(\mathsf{fma}\left(\frac{\frac{1}{8}}{{x}^{3}}, 1 \cdot 1, \left(-\frac{1}{2}\right) \cdot \frac{1}{x} - \frac{{1}^{3}}{\frac{{x}^{5}}{\frac{1}{16}}}\right)\right)}\]

    if -1.0286748310635179 < x < 0.0009302221890111671

    1. Initial program 59.0

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

    if 0.0009302221890111671 < x

    1. Initial program 32.1

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le -1.02867483106351787:\\ \;\;\;\;\log \left(\mathsf{fma}\left(\frac{\frac{1}{8}}{{x}^{3}}, 1 \cdot 1, \left(-\frac{1}{2}\right) \cdot \frac{1}{x} - \frac{{1}^{3}}{\frac{{x}^{5}}{\frac{1}{16}}}\right)\right)\\ \mathbf{elif}\;x \le 9.30222189011167149 \cdot 10^{-4}:\\ \;\;\;\;\left(\log \left(\sqrt{1}\right) + \frac{x}{\sqrt{1}}\right) - \frac{1}{6} \cdot \frac{{x}^{3}}{{\left(\sqrt{1}\right)}^{3}}\\ \mathbf{else}:\\ \;\;\;\;\log \left(\mathsf{hypot}\left(x, \sqrt{1}\right) + x\right)\\ \end{array}\]

Reproduce

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