Average Error: 53.0 → 0.3
Time: 16.4s
Precision: 64
\[\log \left(x + \sqrt{x \cdot x + 1}\right)\]
\[\begin{array}{l} \mathbf{if}\;x \le -0.9982267368695869613759441563161090016365:\\ \;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.0625}{{x}^{5}} + \frac{0.5}{x}\right)\right)\\ \mathbf{elif}\;x \le 0.9479026978334682551619039259094279259443:\\ \;\;\;\;\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}:\\ \;\;\;\;\left(\log 2 + \frac{0.25}{x \cdot x}\right) - \left(\frac{0.09375}{{x}^{4}} - \log x\right)\\ \end{array}\]
\log \left(x + \sqrt{x \cdot x + 1}\right)
\begin{array}{l}
\mathbf{if}\;x \le -0.9982267368695869613759441563161090016365:\\
\;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.0625}{{x}^{5}} + \frac{0.5}{x}\right)\right)\\

\mathbf{elif}\;x \le 0.9479026978334682551619039259094279259443:\\
\;\;\;\;\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}:\\
\;\;\;\;\left(\log 2 + \frac{0.25}{x \cdot x}\right) - \left(\frac{0.09375}{{x}^{4}} - \log x\right)\\

\end{array}
double f(double x) {
        double r153682 = x;
        double r153683 = r153682 * r153682;
        double r153684 = 1.0;
        double r153685 = r153683 + r153684;
        double r153686 = sqrt(r153685);
        double r153687 = r153682 + r153686;
        double r153688 = log(r153687);
        return r153688;
}

double f(double x) {
        double r153689 = x;
        double r153690 = -0.998226736869587;
        bool r153691 = r153689 <= r153690;
        double r153692 = 0.125;
        double r153693 = 3.0;
        double r153694 = pow(r153689, r153693);
        double r153695 = r153692 / r153694;
        double r153696 = 0.0625;
        double r153697 = 5.0;
        double r153698 = pow(r153689, r153697);
        double r153699 = r153696 / r153698;
        double r153700 = 0.5;
        double r153701 = r153700 / r153689;
        double r153702 = r153699 + r153701;
        double r153703 = r153695 - r153702;
        double r153704 = log(r153703);
        double r153705 = 0.9479026978334683;
        bool r153706 = r153689 <= r153705;
        double r153707 = 1.0;
        double r153708 = sqrt(r153707);
        double r153709 = pow(r153708, r153693);
        double r153710 = r153694 / r153709;
        double r153711 = -0.16666666666666666;
        double r153712 = log(r153708);
        double r153713 = r153689 / r153708;
        double r153714 = r153712 + r153713;
        double r153715 = fma(r153710, r153711, r153714);
        double r153716 = 2.0;
        double r153717 = log(r153716);
        double r153718 = 0.25;
        double r153719 = r153689 * r153689;
        double r153720 = r153718 / r153719;
        double r153721 = r153717 + r153720;
        double r153722 = 0.09375;
        double r153723 = 4.0;
        double r153724 = pow(r153689, r153723);
        double r153725 = r153722 / r153724;
        double r153726 = log(r153689);
        double r153727 = r153725 - r153726;
        double r153728 = r153721 - r153727;
        double r153729 = r153706 ? r153715 : r153728;
        double r153730 = r153691 ? r153704 : r153729;
        return r153730;
}

Error

Bits error versus x

Target

Original53.0
Target45.4
Herbie0.3
\[\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 < -0.998226736869587

    1. Initial program 62.6

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

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

      \[\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.3

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

    if -0.998226736869587 < x < 0.9479026978334683

    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.3

      \[\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.3

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

    1. Initial program 31.9

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

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

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

      \[\leadsto \color{blue}{\left(\log 2 + \frac{0.25}{x \cdot x}\right) - \left(\frac{0.09375}{{x}^{4}} - \log x\right)}\]
  3. Recombined 3 regimes into one program.
  4. Final simplification0.3

    \[\leadsto \begin{array}{l} \mathbf{if}\;x \le -0.9982267368695869613759441563161090016365:\\ \;\;\;\;\log \left(\frac{0.125}{{x}^{3}} - \left(\frac{0.0625}{{x}^{5}} + \frac{0.5}{x}\right)\right)\\ \mathbf{elif}\;x \le 0.9479026978334682551619039259094279259443:\\ \;\;\;\;\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}:\\ \;\;\;\;\left(\log 2 + \frac{0.25}{x \cdot x}\right) - \left(\frac{0.09375}{{x}^{4}} - \log x\right)\\ \end{array}\]

Reproduce

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