0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\begin{array}{l}
\mathbf{if}\;re \le 1.09350039928565661 \cdot 10^{227}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\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 r20856 = 0.5;
double r20857 = 2.0;
double r20858 = re;
double r20859 = r20858 * r20858;
double r20860 = im;
double r20861 = r20860 * r20860;
double r20862 = r20859 + r20861;
double r20863 = sqrt(r20862);
double r20864 = r20863 - r20858;
double r20865 = r20857 * r20864;
double r20866 = sqrt(r20865);
double r20867 = r20856 * r20866;
return r20867;
}
double f(double re, double im) {
double r20868 = re;
double r20869 = 1.0935003992856566e+227;
bool r20870 = r20868 <= r20869;
double r20871 = 0.5;
double r20872 = 2.0;
double r20873 = im;
double r20874 = hypot(r20868, r20873);
double r20875 = r20874 - r20868;
double r20876 = r20872 * r20875;
double r20877 = sqrt(r20876);
double r20878 = r20871 * r20877;
double r20879 = 2.0;
double r20880 = pow(r20873, r20879);
double r20881 = 0.0;
double r20882 = r20880 + r20881;
double r20883 = r20868 + r20874;
double r20884 = r20882 / r20883;
double r20885 = r20872 * r20884;
double r20886 = sqrt(r20885);
double r20887 = r20871 * r20886;
double r20888 = r20870 ? r20878 : r20887;
return r20888;
}



Bits error versus re



Bits error versus im
Results
if re < 1.0935003992856566e+227Initial program 36.5
rmApplied hypot-def10.7
if 1.0935003992856566e+227 < re Initial program 64.0
rmApplied flip--64.0
Simplified48.6
Simplified31.6
Final simplification12.1
herbie shell --seed 2020024 +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)))))