0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\begin{array}{l}
\mathbf{if}\;re \le 4.41283550356444898 \cdot 10^{151}:\\
\;\;\;\;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 r17301 = 0.5;
double r17302 = 2.0;
double r17303 = re;
double r17304 = r17303 * r17303;
double r17305 = im;
double r17306 = r17305 * r17305;
double r17307 = r17304 + r17306;
double r17308 = sqrt(r17307);
double r17309 = r17308 - r17303;
double r17310 = r17302 * r17309;
double r17311 = sqrt(r17310);
double r17312 = r17301 * r17311;
return r17312;
}
double f(double re, double im) {
double r17313 = re;
double r17314 = 4.412835503564449e+151;
bool r17315 = r17313 <= r17314;
double r17316 = 0.5;
double r17317 = 2.0;
double r17318 = 1.0;
double r17319 = im;
double r17320 = hypot(r17313, r17319);
double r17321 = r17318 * r17320;
double r17322 = r17321 - r17313;
double r17323 = r17317 * r17322;
double r17324 = sqrt(r17323);
double r17325 = r17316 * r17324;
double r17326 = 2.0;
double r17327 = pow(r17319, r17326);
double r17328 = 0.0;
double r17329 = r17327 + r17328;
double r17330 = r17313 + r17320;
double r17331 = r17329 / r17330;
double r17332 = r17317 * r17331;
double r17333 = sqrt(r17332);
double r17334 = r17316 * r17333;
double r17335 = r17315 ? r17325 : r17334;
return r17335;
}



Bits error versus re



Bits error versus im
Results
if re < 4.412835503564449e+151Initial program 34.2
rmApplied *-un-lft-identity34.2
Applied sqrt-prod34.2
Simplified34.2
Simplified8.7
if 4.412835503564449e+151 < re Initial program 63.9
rmApplied flip--63.9
Simplified50.0
Simplified30.4
Final simplification11.5
herbie shell --seed 2020065 +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)))))