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 r30585 = 0.5;
double r30586 = 2.0;
double r30587 = re;
double r30588 = r30587 * r30587;
double r30589 = im;
double r30590 = r30589 * r30589;
double r30591 = r30588 + r30590;
double r30592 = sqrt(r30591);
double r30593 = r30592 - r30587;
double r30594 = r30586 * r30593;
double r30595 = sqrt(r30594);
double r30596 = r30585 * r30595;
return r30596;
}
double f(double re, double im) {
double r30597 = 0.5;
double r30598 = re;
double r30599 = im;
double r30600 = hypot(r30598, r30599);
double r30601 = r30600 - r30598;
double r30602 = 2.0;
double r30603 = r30601 * r30602;
double r30604 = sqrt(r30603);
double r30605 = r30597 * r30604;
return r30605;
}



Bits error versus re



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