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 r23292 = 0.5;
double r23293 = 2.0;
double r23294 = re;
double r23295 = r23294 * r23294;
double r23296 = im;
double r23297 = r23296 * r23296;
double r23298 = r23295 + r23297;
double r23299 = sqrt(r23298);
double r23300 = r23299 - r23294;
double r23301 = r23293 * r23300;
double r23302 = sqrt(r23301);
double r23303 = r23292 * r23302;
return r23303;
}
double f(double re, double im) {
double r23304 = 0.5;
double r23305 = re;
double r23306 = im;
double r23307 = hypot(r23305, r23306);
double r23308 = r23307 - r23305;
double r23309 = 2.0;
double r23310 = r23308 * r23309;
double r23311 = sqrt(r23310);
double r23312 = r23304 * r23311;
return r23312;
}



Bits error versus re



Bits error versus im
Results
Initial program 38.6
Simplified13.1
Final simplification13.1
herbie shell --seed 2020043 +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)))))