0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}0.5 \cdot \sqrt{\left(\mathsf{hypot}\left(re, im\right) - re\right) \cdot 2}double f(double re, double im) {
double r23718 = 0.5;
double r23719 = 2.0;
double r23720 = re;
double r23721 = r23720 * r23720;
double r23722 = im;
double r23723 = r23722 * r23722;
double r23724 = r23721 + r23723;
double r23725 = sqrt(r23724);
double r23726 = r23725 - r23720;
double r23727 = r23719 * r23726;
double r23728 = sqrt(r23727);
double r23729 = r23718 * r23728;
return r23729;
}
double f(double re, double im) {
double r23730 = 0.5;
double r23731 = re;
double r23732 = im;
double r23733 = hypot(r23731, r23732);
double r23734 = r23733 - r23731;
double r23735 = 2.0;
double r23736 = r23734 * r23735;
double r23737 = sqrt(r23736);
double r23738 = r23730 * r23737;
return r23738;
}



Bits error versus re



Bits error versus im
Results
Initial program 39.3
Simplified13.3
Final simplification13.3
herbie shell --seed 2020046 +o rules:numerics
(FPCore (re im)
:name "math.sqrt on complex, imaginary part, im greater than 0 branch"
:precision binary64
(* 0.5 (sqrt (* 2 (- (sqrt (+ (* re re) (* im im))) re)))))