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 r844376 = 0.5;
double r844377 = 2.0;
double r844378 = re;
double r844379 = r844378 * r844378;
double r844380 = im;
double r844381 = r844380 * r844380;
double r844382 = r844379 + r844381;
double r844383 = sqrt(r844382);
double r844384 = r844383 - r844378;
double r844385 = r844377 * r844384;
double r844386 = sqrt(r844385);
double r844387 = r844376 * r844386;
return r844387;
}
double f(double re, double im) {
double r844388 = re;
double r844389 = im;
double r844390 = hypot(r844388, r844389);
double r844391 = r844390 - r844388;
double r844392 = 2.0;
double r844393 = r844391 * r844392;
double r844394 = sqrt(r844393);
double r844395 = 0.5;
double r844396 = r844394 * r844395;
return r844396;
}



Bits error versus re



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