0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\begin{array}{l}
\mathbf{if}\;\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)} \leq 0:\\
\;\;\;\;0.5 \cdot \left(\left(\sqrt{0.5} \cdot \left(im \cdot \sqrt{2}\right)\right) \cdot \sqrt{\frac{1}{re}}\right)\\
\mathbf{elif}\;\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)} \leq 5.800337674405054 \cdot 10^{-98}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{\sqrt{2 \cdot \left(\left(im + 0.5 \cdot \left(re \cdot \frac{re}{im}\right)\right) - re\right)}} \cdot \sqrt{\sqrt{2 \cdot \left(\left(im + 0.5 \cdot \left(re \cdot \frac{re}{im}\right)\right) - re\right)}}\right)\\
\mathbf{elif}\;\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)} \leq 1.2460153525997797 \cdot 10^{+77}:\\
\;\;\;\;\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)} \cdot 0.5\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im - re\right)}\\
\end{array}(FPCore (re im) :precision binary64 (* 0.5 (sqrt (* 2.0 (- (sqrt (+ (* re re) (* im im))) re)))))
(FPCore (re im)
:precision binary64
(if (<= (sqrt (* 2.0 (- (sqrt (+ (* re re) (* im im))) re))) 0.0)
(* 0.5 (* (* (sqrt 0.5) (* im (sqrt 2.0))) (sqrt (/ 1.0 re))))
(if (<=
(sqrt (* 2.0 (- (sqrt (+ (* re re) (* im im))) re)))
5.800337674405054e-98)
(*
0.5
(*
(sqrt (sqrt (* 2.0 (- (+ im (* 0.5 (* re (/ re im)))) re))))
(sqrt (sqrt (* 2.0 (- (+ im (* 0.5 (* re (/ re im)))) re))))))
(if (<=
(sqrt (* 2.0 (- (sqrt (+ (* re re) (* im im))) re)))
1.2460153525997797e+77)
(* (sqrt (* 2.0 (- (sqrt (+ (* re re) (* im im))) re))) 0.5)
(* 0.5 (sqrt (* 2.0 (- im re))))))))double code(double re, double im) {
return 0.5 * sqrt(2.0 * (sqrt((re * re) + (im * im)) - re));
}
double code(double re, double im) {
double tmp;
if (sqrt(2.0 * (sqrt((re * re) + (im * im)) - re)) <= 0.0) {
tmp = 0.5 * ((sqrt(0.5) * (im * sqrt(2.0))) * sqrt(1.0 / re));
} else if (sqrt(2.0 * (sqrt((re * re) + (im * im)) - re)) <= 5.800337674405054e-98) {
tmp = 0.5 * (sqrt(sqrt(2.0 * ((im + (0.5 * (re * (re / im)))) - re))) * sqrt(sqrt(2.0 * ((im + (0.5 * (re * (re / im)))) - re))));
} else if (sqrt(2.0 * (sqrt((re * re) + (im * im)) - re)) <= 1.2460153525997797e+77) {
tmp = sqrt(2.0 * (sqrt((re * re) + (im * im)) - re)) * 0.5;
} else {
tmp = 0.5 * sqrt(2.0 * (im - re));
}
return tmp;
}



Bits error versus re



Bits error versus im
Results
if (sqrt.f64 (*.f64 2 (-.f64 (sqrt.f64 (+.f64 (*.f64 re re) (*.f64 im im))) re))) < 0.0Initial program 57.7
Taylor expanded around 0 0.8
if 0.0 < (sqrt.f64 (*.f64 2 (-.f64 (sqrt.f64 (+.f64 (*.f64 re re) (*.f64 im im))) re))) < 5.8003376744050537e-98Initial program 55.7
Taylor expanded around 0 17.7
Simplified17.7
rmApplied *-un-lft-identity_binary64_41917.7
Applied times-frac_binary64_42518.5
Simplified18.5
rmApplied add-sqr-sqrt_binary64_44118.8
if 5.8003376744050537e-98 < (sqrt.f64 (*.f64 2 (-.f64 (sqrt.f64 (+.f64 (*.f64 re re) (*.f64 im im))) re))) < 1.24601535259977968e77Initial program 1.5
if 1.24601535259977968e77 < (sqrt.f64 (*.f64 2 (-.f64 (sqrt.f64 (+.f64 (*.f64 re re) (*.f64 im im))) re))) Initial program 63.8
Taylor expanded around 0 35.4
Simplified35.4
Taylor expanded around inf 28.2
Final simplification14.2
herbie shell --seed 2021097
(FPCore (re im)
:name "math.sqrt on complex, imaginary part, im greater than 0 branch"
:precision binary64
:pre (> im 0.0)
(* 0.5 (sqrt (* 2.0 (- (sqrt (+ (* re re) (* im im))) re)))))