\sqrt{0.5 \cdot \left(1 + \frac{x}{\sqrt{\left(4 \cdot p\right) \cdot p + x \cdot x}}\right)}\sqrt{\left(\sqrt{\frac{x}{\sqrt{\mathsf{fma}\left(4 \cdot p, p, x \cdot x\right)}} + 1} \cdot \sqrt{\frac{x}{\sqrt{\mathsf{fma}\left(4 \cdot p, p, x \cdot x\right)}} + 1}\right) \cdot 0.5}double f(double p, double x) {
double r239359 = 0.5;
double r239360 = 1.0;
double r239361 = x;
double r239362 = 4.0;
double r239363 = p;
double r239364 = r239362 * r239363;
double r239365 = r239364 * r239363;
double r239366 = r239361 * r239361;
double r239367 = r239365 + r239366;
double r239368 = sqrt(r239367);
double r239369 = r239361 / r239368;
double r239370 = r239360 + r239369;
double r239371 = r239359 * r239370;
double r239372 = sqrt(r239371);
return r239372;
}
double f(double p, double x) {
double r239373 = x;
double r239374 = 4.0;
double r239375 = p;
double r239376 = r239374 * r239375;
double r239377 = r239373 * r239373;
double r239378 = fma(r239376, r239375, r239377);
double r239379 = sqrt(r239378);
double r239380 = r239373 / r239379;
double r239381 = 1.0;
double r239382 = r239380 + r239381;
double r239383 = sqrt(r239382);
double r239384 = r239383 * r239383;
double r239385 = 0.5;
double r239386 = r239384 * r239385;
double r239387 = sqrt(r239386);
return r239387;
}




Bits error versus p




Bits error versus x
| Original | 12.7 |
|---|---|
| Target | 12.7 |
| Herbie | 12.7 |
Initial program 12.7
Simplified12.7
rmApplied add-sqr-sqrt12.7
Final simplification12.7
herbie shell --seed 2019209 +o rules:numerics
(FPCore (p x)
:name "Given's Rotation SVD example"
:precision binary64
:pre (< 1.00000000000000001e-150 (fabs x) 9.99999999999999981e149)
:herbie-target
(sqrt (+ 0.5 (/ (copysign 0.5 x) (hypot 1 (/ (* 2 p) x)))))
(sqrt (* 0.5 (+ 1 (/ x (sqrt (+ (* (* 4 p) p) (* x x))))))))