\sqrt{0.5 \cdot \left(1 + \frac{x}{\sqrt{\left(4 \cdot p\right) \cdot p + x \cdot x}}\right)}\sqrt{0.5 \cdot \left(1 + \frac{x}{\sqrt{\sqrt{\left(4 \cdot p\right) \cdot p + x \cdot x}} \cdot \sqrt{\sqrt{\left(4 \cdot p\right) \cdot p + x \cdot x}}}\right)}double f(double p, double x) {
double r274356 = 0.5;
double r274357 = 1.0;
double r274358 = x;
double r274359 = 4.0;
double r274360 = p;
double r274361 = r274359 * r274360;
double r274362 = r274361 * r274360;
double r274363 = r274358 * r274358;
double r274364 = r274362 + r274363;
double r274365 = sqrt(r274364);
double r274366 = r274358 / r274365;
double r274367 = r274357 + r274366;
double r274368 = r274356 * r274367;
double r274369 = sqrt(r274368);
return r274369;
}
double f(double p, double x) {
double r274370 = 0.5;
double r274371 = 1.0;
double r274372 = x;
double r274373 = 4.0;
double r274374 = p;
double r274375 = r274373 * r274374;
double r274376 = r274375 * r274374;
double r274377 = r274372 * r274372;
double r274378 = r274376 + r274377;
double r274379 = sqrt(r274378);
double r274380 = sqrt(r274379);
double r274381 = r274380 * r274380;
double r274382 = r274372 / r274381;
double r274383 = r274371 + r274382;
double r274384 = r274370 * r274383;
double r274385 = sqrt(r274384);
return r274385;
}




Bits error versus p




Bits error versus x
Results
| Original | 13.4 |
|---|---|
| Target | 13.4 |
| Herbie | 14.3 |
Initial program 13.4
rmApplied add-log-exp13.4
rmApplied add-sqr-sqrt13.4
Applied sqrt-prod14.3
rmApplied add-cbrt-cube14.3
Simplified14.3
Final simplification14.3
herbie shell --seed 2019297
(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))))))))