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 r15109 = 0.5;
double r15110 = 2.0;
double r15111 = re;
double r15112 = r15111 * r15111;
double r15113 = im;
double r15114 = r15113 * r15113;
double r15115 = r15112 + r15114;
double r15116 = sqrt(r15115);
double r15117 = r15116 - r15111;
double r15118 = r15110 * r15117;
double r15119 = sqrt(r15118);
double r15120 = r15109 * r15119;
return r15120;
}
double f(double re, double im) {
double r15121 = 0.5;
double r15122 = re;
double r15123 = im;
double r15124 = hypot(r15122, r15123);
double r15125 = r15124 - r15122;
double r15126 = 2.0;
double r15127 = r15125 * r15126;
double r15128 = sqrt(r15127);
double r15129 = r15121 * r15128;
return r15129;
}



Bits error versus re



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