\frac{1}{\sqrt{x}} - \frac{1}{\sqrt{x + 1}}
\begin{array}{l}
t_0 := {\left(1 + x\right)}^{-0.5}\\
t_1 := {\left(1 + x\right)}^{-0.25}\\
t_2 := t_1 \cdot \sqrt[3]{t_1}\\
t_3 := t_2 \cdot \sqrt[3]{t_0}\\
\mathbf{if}\;\frac{1}{\sqrt{x}} - \frac{1}{\sqrt{1 + x}} \leq 4.621890052781269 \cdot 10^{-7}:\\
\;\;\;\;\frac{\left(\frac{1.5}{x \cdot x} + \frac{1.484375}{{x}^{4}}\right) - \left(\frac{1.5}{{x}^{3}} + \frac{1.46875}{{x}^{5}}\right)}{{x}^{-0.5} + \left(t_0 + {\left(x \cdot \left(1 + x\right)\right)}^{-0.25}\right)}\\
\mathbf{else}:\\
\;\;\;\;\mathsf{fma}\left(1, {x}^{-0.5}, -t_3\right) + \mathsf{fma}\left(-t_2, e^{-0.16666666666666666 \cdot \mathsf{log1p}\left(x\right)}, t_3\right)\\
\end{array}
(FPCore (x) :precision binary64 (- (/ 1.0 (sqrt x)) (/ 1.0 (sqrt (+ x 1.0)))))
(FPCore (x)
:precision binary64
(let* ((t_0 (pow (+ 1.0 x) -0.5))
(t_1 (pow (+ 1.0 x) -0.25))
(t_2 (* t_1 (cbrt t_1)))
(t_3 (* t_2 (cbrt t_0))))
(if (<= (- (/ 1.0 (sqrt x)) (/ 1.0 (sqrt (+ 1.0 x)))) 4.621890052781269e-7)
(/
(-
(+ (/ 1.5 (* x x)) (/ 1.484375 (pow x 4.0)))
(+ (/ 1.5 (pow x 3.0)) (/ 1.46875 (pow x 5.0))))
(+ (pow x -0.5) (+ t_0 (pow (* x (+ 1.0 x)) -0.25))))
(+
(fma 1.0 (pow x -0.5) (- t_3))
(fma (- t_2) (exp (* -0.16666666666666666 (log1p x))) t_3)))))double code(double x) {
return (1.0 / sqrt(x)) - (1.0 / sqrt((x + 1.0)));
}
double code(double x) {
double t_0 = pow((1.0 + x), -0.5);
double t_1 = pow((1.0 + x), -0.25);
double t_2 = t_1 * cbrt(t_1);
double t_3 = t_2 * cbrt(t_0);
double tmp;
if (((1.0 / sqrt(x)) - (1.0 / sqrt((1.0 + x)))) <= 4.621890052781269e-7) {
tmp = (((1.5 / (x * x)) + (1.484375 / pow(x, 4.0))) - ((1.5 / pow(x, 3.0)) + (1.46875 / pow(x, 5.0)))) / (pow(x, -0.5) + (t_0 + pow((x * (1.0 + x)), -0.25)));
} else {
tmp = fma(1.0, pow(x, -0.5), -t_3) + fma(-t_2, exp((-0.16666666666666666 * log1p(x))), t_3);
}
return tmp;
}




Bits error versus x
| Original | 19.4 |
|---|---|
| Target | 0.7 |
| Herbie | 5.3 |
if (-.f64 (/.f64 1 (sqrt.f64 x)) (/.f64 1 (sqrt.f64 (+.f64 x 1)))) < 4.6218900527813e-7Initial program 38.8
Applied egg-rr38.8
Applied egg-rr38.7
Taylor expanded in x around inf 10.6
Simplified10.5
if 4.6218900527813e-7 < (-.f64 (/.f64 1 (sqrt.f64 x)) (/.f64 1 (sqrt.f64 (+.f64 x 1)))) Initial program 0.3
Applied egg-rr0.6
Applied egg-rr0.1
Applied egg-rr0.1
Final simplification5.3
herbie shell --seed 2022127
(FPCore (x)
:name "2isqrt (example 3.6)"
:precision binary64
:herbie-target
(/ 1.0 (+ (* (+ x 1.0) (sqrt x)) (* x (sqrt (+ x 1.0)))))
(- (/ 1.0 (sqrt x)) (/ 1.0 (sqrt (+ x 1.0)))))