0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\begin{array}{l}
\mathbf{if}\;re \le 204492313024091095000:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\left(\mathsf{hypot}\left(re, im\right) - re\right) + 0\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 r18239 = 0.5;
double r18240 = 2.0;
double r18241 = re;
double r18242 = r18241 * r18241;
double r18243 = im;
double r18244 = r18243 * r18243;
double r18245 = r18242 + r18244;
double r18246 = sqrt(r18245);
double r18247 = r18246 - r18241;
double r18248 = r18240 * r18247;
double r18249 = sqrt(r18248);
double r18250 = r18239 * r18249;
return r18250;
}
double f(double re, double im) {
double r18251 = re;
double r18252 = 2.044923130240911e+20;
bool r18253 = r18251 <= r18252;
double r18254 = 0.5;
double r18255 = 2.0;
double r18256 = im;
double r18257 = hypot(r18251, r18256);
double r18258 = r18257 - r18251;
double r18259 = 0.0;
double r18260 = r18258 + r18259;
double r18261 = r18255 * r18260;
double r18262 = sqrt(r18261);
double r18263 = r18254 * r18262;
double r18264 = 2.0;
double r18265 = pow(r18256, r18264);
double r18266 = r18265 + r18259;
double r18267 = r18251 + r18257;
double r18268 = r18266 / r18267;
double r18269 = r18255 * r18268;
double r18270 = sqrt(r18269);
double r18271 = r18254 * r18270;
double r18272 = r18253 ? r18263 : r18271;
return r18272;
}



Bits error versus re



Bits error versus im
Results
if re < 2.044923130240911e+20Initial program 32.6
rmApplied add-cube-cbrt32.7
Applied add-sqr-sqrt32.7
Applied sqrt-prod32.8
Applied prod-diff32.8
Simplified5.3
Simplified5.2
if 2.044923130240911e+20 < re Initial program 57.1
rmApplied flip--57.1
Simplified40.4
Simplified30.2
Final simplification11.1
herbie shell --seed 2020003 +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)))))