0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\begin{array}{l}
\mathbf{if}\;re \le 4.31409746536756331 \cdot 10^{89}:\\
\;\;\;\;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 r10595 = 0.5;
double r10596 = 2.0;
double r10597 = re;
double r10598 = r10597 * r10597;
double r10599 = im;
double r10600 = r10599 * r10599;
double r10601 = r10598 + r10600;
double r10602 = sqrt(r10601);
double r10603 = r10602 - r10597;
double r10604 = r10596 * r10603;
double r10605 = sqrt(r10604);
double r10606 = r10595 * r10605;
return r10606;
}
double f(double re, double im) {
double r10607 = re;
double r10608 = 4.3140974653675633e+89;
bool r10609 = r10607 <= r10608;
double r10610 = 0.5;
double r10611 = 2.0;
double r10612 = 1.0;
double r10613 = im;
double r10614 = hypot(r10607, r10613);
double r10615 = r10612 * r10614;
double r10616 = r10615 - r10607;
double r10617 = r10611 * r10616;
double r10618 = sqrt(r10617);
double r10619 = r10610 * r10618;
double r10620 = 2.0;
double r10621 = pow(r10613, r10620);
double r10622 = 0.0;
double r10623 = r10621 + r10622;
double r10624 = r10607 + r10614;
double r10625 = r10623 / r10624;
double r10626 = r10611 * r10625;
double r10627 = sqrt(r10626);
double r10628 = r10610 * r10627;
double r10629 = r10609 ? r10619 : r10628;
return r10629;
}



Bits error versus re



Bits error versus im
Results
if re < 4.3140974653675633e+89Initial program 34.2
rmApplied *-un-lft-identity34.2
Applied sqrt-prod34.2
Simplified34.2
Simplified7.6
if 4.3140974653675633e+89 < re Initial program 60.7
rmApplied flip--60.7
Simplified45.8
Simplified31.4
Final simplification11.9
herbie shell --seed 2020036 +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)))))