0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\begin{array}{l}
\mathbf{if}\;re \leq -5.92404308041133 \cdot 10^{+81}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re \cdot -2\right)}\\
\mathbf{elif}\;re \leq -4029.537249877249:\\
\;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \sqrt{\sqrt{re \cdot re + im \cdot im} - re}\right)\\
\mathbf{elif}\;re \leq -4.394426049509313 \cdot 10^{-15}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im - re\right)}\\
\mathbf{elif}\;re \leq -3.050262596495973 \cdot 10^{-40}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \sqrt{\sqrt{re \cdot re + im \cdot im} - re}\right)\\
\mathbf{elif}\;re \leq 1.9579733112277025 \cdot 10^{+20}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \sqrt{im - re}\right)\\
\mathbf{elif}\;re \leq 2.1025679527940389 \cdot 10^{+105}:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{2 \cdot \left(im \cdot im\right)}}{\sqrt{re + \sqrt{re \cdot re + im \cdot im}}}\\
\mathbf{elif}\;re \leq 2.6360421142108628 \cdot 10^{+222}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im - re\right)}\\
\mathbf{else}:\\
\;\;\;\;0\\
\end{array}(FPCore (re im) :precision binary64 (* 0.5 (sqrt (* 2.0 (- (sqrt (+ (* re re) (* im im))) re)))))
(FPCore (re im)
:precision binary64
(if (<= re -5.92404308041133e+81)
(* 0.5 (sqrt (* 2.0 (* re -2.0))))
(if (<= re -4029.537249877249)
(* 0.5 (* (sqrt 2.0) (sqrt (- (sqrt (+ (* re re) (* im im))) re))))
(if (<= re -4.394426049509313e-15)
(* 0.5 (sqrt (* 2.0 (- im re))))
(if (<= re -3.050262596495973e-40)
(* 0.5 (* (sqrt 2.0) (sqrt (- (sqrt (+ (* re re) (* im im))) re))))
(if (<= re 1.9579733112277025e+20)
(* 0.5 (* (sqrt 2.0) (sqrt (- im re))))
(if (<= re 2.1025679527940389e+105)
(*
0.5
(/
(sqrt (* 2.0 (* im im)))
(sqrt (+ re (sqrt (+ (* re re) (* im im)))))))
(if (<= re 2.6360421142108628e+222)
(* 0.5 (sqrt (* 2.0 (- im re))))
0.0))))))))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 (re <= -5.92404308041133e+81) {
tmp = 0.5 * sqrt(2.0 * (re * -2.0));
} else if (re <= -4029.537249877249) {
tmp = 0.5 * (sqrt(2.0) * sqrt(sqrt((re * re) + (im * im)) - re));
} else if (re <= -4.394426049509313e-15) {
tmp = 0.5 * sqrt(2.0 * (im - re));
} else if (re <= -3.050262596495973e-40) {
tmp = 0.5 * (sqrt(2.0) * sqrt(sqrt((re * re) + (im * im)) - re));
} else if (re <= 1.9579733112277025e+20) {
tmp = 0.5 * (sqrt(2.0) * sqrt(im - re));
} else if (re <= 2.1025679527940389e+105) {
tmp = 0.5 * (sqrt(2.0 * (im * im)) / sqrt(re + sqrt((re * re) + (im * im))));
} else if (re <= 2.6360421142108628e+222) {
tmp = 0.5 * sqrt(2.0 * (im - re));
} else {
tmp = 0.0;
}
return tmp;
}



Bits error versus re



Bits error versus im
Results
if re < -5.9240430804113297e81Initial program 48.4
Taylor expanded around -inf 10.4
Simplified10.4
if -5.9240430804113297e81 < re < -4029.537249877249 or -4.3944260495093133e-15 < re < -3.05026259649597315e-40Initial program 17.0
rmApplied sqrt-prod_binary64_43917.3
if -4029.537249877249 < re < -4.3944260495093133e-15 or 2.1025679527940389e105 < re < 2.63604211421086276e222Initial program 52.4
Taylor expanded around 0 46.0
if -3.05026259649597315e-40 < re < 195797331122770248000Initial program 30.0
Taylor expanded around 0 13.9
rmApplied sqrt-prod_binary64_43914.2
if 195797331122770248000 < re < 2.1025679527940389e105Initial program 48.5
rmApplied flip--_binary64_39848.5
Applied associate-*r/_binary64_36548.5
Applied sqrt-div_binary64_44048.5
Simplified27.2
Simplified27.2
if 2.63604211421086276e222 < re Initial program 64.0
Taylor expanded around inf 48.2
Final simplification20.5
herbie shell --seed 2020289
(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)))))