0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\begin{array}{l}
\mathbf{if}\;re \le 3.3204403376095907 \cdot 10^{174}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(1 \cdot \mathsf{hypot}\left(re, im\right) - re\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2} + 0}{re + \mathsf{hypot}\left(re, im\right)}}\\
\end{array}double f(double re, double im) {
double r16963 = 0.5;
double r16964 = 2.0;
double r16965 = re;
double r16966 = r16965 * r16965;
double r16967 = im;
double r16968 = r16967 * r16967;
double r16969 = r16966 + r16968;
double r16970 = sqrt(r16969);
double r16971 = r16970 - r16965;
double r16972 = r16964 * r16971;
double r16973 = sqrt(r16972);
double r16974 = r16963 * r16973;
return r16974;
}
double f(double re, double im) {
double r16975 = re;
double r16976 = 3.3204403376095907e+174;
bool r16977 = r16975 <= r16976;
double r16978 = 0.5;
double r16979 = 2.0;
double r16980 = 1.0;
double r16981 = im;
double r16982 = hypot(r16975, r16981);
double r16983 = r16980 * r16982;
double r16984 = r16983 - r16975;
double r16985 = r16979 * r16984;
double r16986 = sqrt(r16985);
double r16987 = r16978 * r16986;
double r16988 = 2.0;
double r16989 = pow(r16981, r16988);
double r16990 = 0.0;
double r16991 = r16989 + r16990;
double r16992 = r16975 + r16982;
double r16993 = r16991 / r16992;
double r16994 = r16979 * r16993;
double r16995 = sqrt(r16994);
double r16996 = r16978 * r16995;
double r16997 = r16977 ? r16987 : r16996;
return r16997;
}



Bits error versus re



Bits error versus im
Results
if re < 3.3204403376095907e+174Initial program 36.1
rmApplied *-un-lft-identity36.1
Applied sqrt-prod36.1
Simplified36.1
Simplified9.6
if 3.3204403376095907e+174 < re Initial program 64.0
rmApplied flip--64.0
Simplified50.4
Simplified31.1
Final simplification11.9
herbie shell --seed 2020089 +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)))))