0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\begin{array}{l}
\mathbf{if}\;re \le 1.277594572889913386863098304318627392833 \cdot 10^{-80}:\\
\;\;\;\;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{\mathsf{fma}\left(im, im, 0\right)}{re + \mathsf{hypot}\left(re, im\right)}}\\
\end{array}double f(double re, double im) {
double r11636 = 0.5;
double r11637 = 2.0;
double r11638 = re;
double r11639 = r11638 * r11638;
double r11640 = im;
double r11641 = r11640 * r11640;
double r11642 = r11639 + r11641;
double r11643 = sqrt(r11642);
double r11644 = r11643 - r11638;
double r11645 = r11637 * r11644;
double r11646 = sqrt(r11645);
double r11647 = r11636 * r11646;
return r11647;
}
double f(double re, double im) {
double r11648 = re;
double r11649 = 1.2775945728899134e-80;
bool r11650 = r11648 <= r11649;
double r11651 = 0.5;
double r11652 = 2.0;
double r11653 = 1.0;
double r11654 = im;
double r11655 = hypot(r11648, r11654);
double r11656 = r11653 * r11655;
double r11657 = r11656 - r11648;
double r11658 = r11652 * r11657;
double r11659 = sqrt(r11658);
double r11660 = r11651 * r11659;
double r11661 = 0.0;
double r11662 = fma(r11654, r11654, r11661);
double r11663 = r11648 + r11655;
double r11664 = r11662 / r11663;
double r11665 = r11652 * r11664;
double r11666 = sqrt(r11665);
double r11667 = r11651 * r11666;
double r11668 = r11650 ? r11660 : r11667;
return r11668;
}



Bits error versus re



Bits error versus im
if re < 1.2775945728899134e-80Initial program 32.0
rmApplied *-un-lft-identity32.0
Applied sqrt-prod32.0
Simplified32.0
Simplified3.0
if 1.2775945728899134e-80 < re Initial program 54.8
rmApplied flip--54.8
Simplified38.9
Simplified30.6
Final simplification11.7
herbie shell --seed 2019344 +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)))))