0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\sqrt{\left(\mathsf{hypot}\left(re, im\right) - re\right) \cdot 2.0} \cdot 0.5double f(double re, double im) {
double r533196 = 0.5;
double r533197 = 2.0;
double r533198 = re;
double r533199 = r533198 * r533198;
double r533200 = im;
double r533201 = r533200 * r533200;
double r533202 = r533199 + r533201;
double r533203 = sqrt(r533202);
double r533204 = r533203 - r533198;
double r533205 = r533197 * r533204;
double r533206 = sqrt(r533205);
double r533207 = r533196 * r533206;
return r533207;
}
double f(double re, double im) {
double r533208 = re;
double r533209 = im;
double r533210 = hypot(r533208, r533209);
double r533211 = r533210 - r533208;
double r533212 = 2.0;
double r533213 = r533211 * r533212;
double r533214 = sqrt(r533213);
double r533215 = 0.5;
double r533216 = r533214 * r533215;
return r533216;
}



Bits error versus re



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