\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 r268910 = 0.5;
double r268911 = 1.0;
double r268912 = x;
double r268913 = 4.0;
double r268914 = p;
double r268915 = r268913 * r268914;
double r268916 = r268915 * r268914;
double r268917 = r268912 * r268912;
double r268918 = r268916 + r268917;
double r268919 = sqrt(r268918);
double r268920 = r268912 / r268919;
double r268921 = r268911 + r268920;
double r268922 = r268910 * r268921;
double r268923 = sqrt(r268922);
return r268923;
}
double f(double p, double x) {
double r268924 = 0.5;
double r268925 = 1.0;
double r268926 = x;
double r268927 = 1.0;
double r268928 = 4.0;
double r268929 = p;
double r268930 = r268928 * r268929;
double r268931 = r268930 * r268929;
double r268932 = r268926 * r268926;
double r268933 = r268931 + r268932;
double r268934 = sqrt(r268933);
double r268935 = r268927 / r268934;
double r268936 = r268926 * r268935;
double r268937 = r268925 + r268936;
double r268938 = r268924 * r268937;
double r268939 = sqrt(r268938);
return r268939;
}




Bits error versus p




Bits error versus x
Results
| Original | 13.0 |
|---|---|
| Target | 13.0 |
| Herbie | 13.2 |
Initial program 13.0
rmApplied div-inv13.2
Final simplification13.2
herbie shell --seed 2019347
(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))))))))