0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\begin{array}{l}
\mathbf{if}\;re \le 9087940982052.582:\\
\;\;\;\;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 r20586 = 0.5;
double r20587 = 2.0;
double r20588 = re;
double r20589 = r20588 * r20588;
double r20590 = im;
double r20591 = r20590 * r20590;
double r20592 = r20589 + r20591;
double r20593 = sqrt(r20592);
double r20594 = r20593 - r20588;
double r20595 = r20587 * r20594;
double r20596 = sqrt(r20595);
double r20597 = r20586 * r20596;
return r20597;
}
double f(double re, double im) {
double r20598 = re;
double r20599 = 9087940982052.582;
bool r20600 = r20598 <= r20599;
double r20601 = 0.5;
double r20602 = 2.0;
double r20603 = im;
double r20604 = hypot(r20598, r20603);
double r20605 = r20604 - r20598;
double r20606 = 0.0;
double r20607 = r20605 + r20606;
double r20608 = r20602 * r20607;
double r20609 = sqrt(r20608);
double r20610 = r20601 * r20609;
double r20611 = 2.0;
double r20612 = pow(r20603, r20611);
double r20613 = r20612 + r20606;
double r20614 = r20598 + r20604;
double r20615 = r20613 / r20614;
double r20616 = r20602 * r20615;
double r20617 = sqrt(r20616);
double r20618 = r20601 * r20617;
double r20619 = r20600 ? r20610 : r20618;
return r20619;
}



Bits error versus re



Bits error versus im
Results
if re < 9087940982052.582Initial program 33.1
rmApplied add-cube-cbrt33.2
Applied add-sqr-sqrt33.2
Applied sqrt-prod33.3
Applied prod-diff33.3
Simplified5.4
Simplified5.3
if 9087940982052.582 < re Initial program 58.3
rmApplied flip--58.3
Simplified40.6
Simplified30.5
Final simplification11.5
herbie shell --seed 2020049 +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)))))