0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}0.5 \cdot \sqrt{\left(re + \mathsf{hypot}\left(re, im\right)\right) \cdot 2}double f(double re, double im) {
double r114869 = 0.5;
double r114870 = 2.0;
double r114871 = re;
double r114872 = r114871 * r114871;
double r114873 = im;
double r114874 = r114873 * r114873;
double r114875 = r114872 + r114874;
double r114876 = sqrt(r114875);
double r114877 = r114876 + r114871;
double r114878 = r114870 * r114877;
double r114879 = sqrt(r114878);
double r114880 = r114869 * r114879;
return r114880;
}
double f(double re, double im) {
double r114881 = 0.5;
double r114882 = re;
double r114883 = im;
double r114884 = hypot(r114882, r114883);
double r114885 = r114882 + r114884;
double r114886 = 2.0;
double r114887 = r114885 * r114886;
double r114888 = sqrt(r114887);
double r114889 = r114881 * r114888;
return r114889;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.6 |
|---|---|
| Target | 33.7 |
| Herbie | 13.4 |
Initial program 38.6
Simplified13.4
rmApplied sqrt-prod13.7
rmApplied add-sqr-sqrt13.7
Applied sqrt-prod13.8
Applied associate-*r*13.8
rmApplied sqrt-unprod13.6
Applied sqrt-unprod13.8
Simplified13.4
Final simplification13.4
herbie shell --seed 2019323 +o rules:numerics
(FPCore (re im)
:name "math.sqrt on complex, real part"
:precision binary64
:herbie-target
(if (< re 0.0) (* 0.5 (* (sqrt 2) (sqrt (/ (* im im) (- (sqrt (+ (* re re) (* im im))) re))))) (* 0.5 (sqrt (* 2 (+ (sqrt (+ (* re re) (* im im))) re)))))
(* 0.5 (sqrt (* 2 (+ (sqrt (+ (* re re) (* im im))) re)))))