\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 + x \cdot \frac{1}{\sqrt{\left(4 \cdot p\right) \cdot p + x \cdot x}}\right)}double f(double p, double x) {
double r382478 = 0.5;
double r382479 = 1.0;
double r382480 = x;
double r382481 = 4.0;
double r382482 = p;
double r382483 = r382481 * r382482;
double r382484 = r382483 * r382482;
double r382485 = r382480 * r382480;
double r382486 = r382484 + r382485;
double r382487 = sqrt(r382486);
double r382488 = r382480 / r382487;
double r382489 = r382479 + r382488;
double r382490 = r382478 * r382489;
double r382491 = sqrt(r382490);
return r382491;
}
double f(double p, double x) {
double r382492 = 0.5;
double r382493 = 1.0;
double r382494 = x;
double r382495 = 1.0;
double r382496 = 4.0;
double r382497 = p;
double r382498 = r382496 * r382497;
double r382499 = r382498 * r382497;
double r382500 = r382494 * r382494;
double r382501 = r382499 + r382500;
double r382502 = sqrt(r382501);
double r382503 = r382495 / r382502;
double r382504 = r382494 * r382503;
double r382505 = r382493 + r382504;
double r382506 = r382492 * r382505;
double r382507 = sqrt(r382506);
return r382507;
}




Bits error versus p




Bits error versus x
Results
| Original | 12.9 |
|---|---|
| Target | 12.9 |
| Herbie | 13.1 |
Initial program 12.9
rmApplied div-inv13.1
Final simplification13.1
herbie shell --seed 2020047
(FPCore (p x)
:name "Given's Rotation SVD example"
:precision binary64
:pre (< 1e-150 (fabs x) 1e+150)
: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))))))))