\log \left(x + \sqrt{x \cdot x + 1}\right)\begin{array}{l}
\mathbf{if}\;x \le -1.0577364498603914:\\
\;\;\;\;\log \left(\frac{\frac{\frac{1}{8}}{x}}{x \cdot x} - \left(\frac{\frac{1}{2}}{x} + \frac{\frac{1}{16}}{{x}^{5}}\right)\right)\\
\mathbf{elif}\;x \le 1.017737757509055:\\
\;\;\;\;\mathsf{fma}\left(\left(x \cdot \frac{-1}{6}\right), \left(x \cdot x\right), \left(\mathsf{fma}\left(\frac{3}{40}, \left({x}^{5}\right), x\right)\right)\right)\\
\mathbf{else}:\\
\;\;\;\;\log x + \left(\left(\frac{\frac{1}{4}}{x \cdot x} + \log 2\right) + \frac{\frac{-3}{32}}{\left(x \cdot x\right) \cdot \left(x \cdot x\right)}\right)\\
\end{array}double f(double x) {
double r23525186 = x;
double r23525187 = r23525186 * r23525186;
double r23525188 = 1.0;
double r23525189 = r23525187 + r23525188;
double r23525190 = sqrt(r23525189);
double r23525191 = r23525186 + r23525190;
double r23525192 = log(r23525191);
return r23525192;
}
double f(double x) {
double r23525193 = x;
double r23525194 = -1.0577364498603914;
bool r23525195 = r23525193 <= r23525194;
double r23525196 = 0.125;
double r23525197 = r23525196 / r23525193;
double r23525198 = r23525193 * r23525193;
double r23525199 = r23525197 / r23525198;
double r23525200 = 0.5;
double r23525201 = r23525200 / r23525193;
double r23525202 = 0.0625;
double r23525203 = 5.0;
double r23525204 = pow(r23525193, r23525203);
double r23525205 = r23525202 / r23525204;
double r23525206 = r23525201 + r23525205;
double r23525207 = r23525199 - r23525206;
double r23525208 = log(r23525207);
double r23525209 = 1.017737757509055;
bool r23525210 = r23525193 <= r23525209;
double r23525211 = -0.16666666666666666;
double r23525212 = r23525193 * r23525211;
double r23525213 = 0.075;
double r23525214 = fma(r23525213, r23525204, r23525193);
double r23525215 = fma(r23525212, r23525198, r23525214);
double r23525216 = log(r23525193);
double r23525217 = 0.25;
double r23525218 = r23525217 / r23525198;
double r23525219 = 2.0;
double r23525220 = log(r23525219);
double r23525221 = r23525218 + r23525220;
double r23525222 = -0.09375;
double r23525223 = r23525198 * r23525198;
double r23525224 = r23525222 / r23525223;
double r23525225 = r23525221 + r23525224;
double r23525226 = r23525216 + r23525225;
double r23525227 = r23525210 ? r23525215 : r23525226;
double r23525228 = r23525195 ? r23525208 : r23525227;
return r23525228;
}




Bits error versus x
| Original | 52.4 |
|---|---|
| Target | 44.9 |
| Herbie | 0.2 |
if x < -1.0577364498603914Initial program 61.8
Simplified61.0
Taylor expanded around -inf 0.2
Simplified0.2
if -1.0577364498603914 < x < 1.017737757509055Initial program 58.6
Simplified58.6
Taylor expanded around 0 0.2
Simplified0.2
if 1.017737757509055 < x Initial program 30.5
Simplified0.2
Taylor expanded around inf 0.4
Simplified0.4
Final simplification0.2
herbie shell --seed 2019121 +o rules:numerics
(FPCore (x)
:name "Hyperbolic arcsine"
:herbie-target
(if (< x 0) (log (/ -1 (- x (sqrt (+ (* x x) 1))))) (log (+ x (sqrt (+ (* x x) 1)))))
(log (+ x (sqrt (+ (* x x) 1)))))