Average Error: 53.1 → 0.1
Time: 18.2s
Precision: 64
\[\log \left(x + \sqrt{x \cdot x + 1}\right)\]
\[\begin{array}{l} \mathbf{if}\;x \le -1.021894228612228561203778554045129567385:\\ \;\;\;\;\log \left(\left(\frac{0.125}{{x}^{3}} - \frac{0.5}{x}\right) - \frac{0.0625}{{x}^{5}}\right)\\ \mathbf{elif}\;x \le 9.62392103013770539021720651362556964159 \cdot 10^{-4}:\\ \;\;\;\;\mathsf{fma}\left(\frac{{x}^{3}}{1 \cdot \sqrt{1}}, \frac{-1}{6}, \log \left(\sqrt{1}\right) + \frac{x}{\sqrt{1}}\right)\\ \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.021894228612228561203778554045129567385:\\
\;\;\;\;\log \left(\left(\frac{0.125}{{x}^{3}} - \frac{0.5}{x}\right) - \frac{0.0625}{{x}^{5}}\right)\\

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

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

\end{array}
double f(double x) {
        double r166224 = x;
        double r166225 = r166224 * r166224;
        double r166226 = 1.0;
        double r166227 = r166225 + r166226;
        double r166228 = sqrt(r166227);
        double r166229 = r166224 + r166228;
        double r166230 = log(r166229);
        return r166230;
}

double f(double x) {
        double r166231 = x;
        double r166232 = -1.0218942286122286;
        bool r166233 = r166231 <= r166232;
        double r166234 = 0.125;
        double r166235 = 3.0;
        double r166236 = pow(r166231, r166235);
        double r166237 = r166234 / r166236;
        double r166238 = 0.5;
        double r166239 = r166238 / r166231;
        double r166240 = r166237 - r166239;
        double r166241 = 0.0625;
        double r166242 = 5.0;
        double r166243 = pow(r166231, r166242);
        double r166244 = r166241 / r166243;
        double r166245 = r166240 - r166244;
        double r166246 = log(r166245);
        double r166247 = 0.0009623921030137705;
        bool r166248 = r166231 <= r166247;
        double r166249 = 1.0;
        double r166250 = sqrt(r166249);
        double r166251 = r166249 * r166250;
        double r166252 = r166236 / r166251;
        double r166253 = -0.16666666666666666;
        double r166254 = log(r166250);
        double r166255 = r166231 / r166250;
        double r166256 = r166254 + r166255;
        double r166257 = fma(r166252, r166253, r166256);
        double r166258 = hypot(r166231, r166250);
        double r166259 = r166258 + r166231;
        double r166260 = log(r166259);
        double r166261 = r166248 ? r166257 : r166260;
        double r166262 = r166233 ? r166246 : r166261;
        return r166262;
}

Error

Bits error versus x

Target

Original53.1
Target45.4
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.0218942286122286

    1. Initial program 63.3

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

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

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

    if -1.0218942286122286 < x < 0.0009623921030137705

    1. Initial program 58.9

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

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

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

    if 0.0009623921030137705 < x

    1. Initial program 31.7

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

      \[\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)\]
  3. Recombined 3 regimes into one program.
  4. Final simplification0.1

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

Reproduce

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

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

  (log (+ x (sqrt (+ (* x x) 1.0)))))