0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \leq -2.0399582988562903 \cdot 10^{+105}:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{2} \cdot \left|im\right|}{\sqrt{re \cdot -2}}\\
\mathbf{elif}\;re \leq -5.497046773567483 \cdot 10^{-226}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{\sqrt{2}} \cdot \frac{\left|im\right| \cdot \sqrt{\sqrt{2}}}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}\right)\\
\mathbf{elif}\;re \leq 8.65010257179912 \cdot 10^{-262}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\
\mathbf{elif}\;re \leq 3.0513166345511567 \cdot 10^{-168}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re - im\right)}\\
\mathbf{elif}\;re \leq 1.6419980517252478 \cdot 10^{+115}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + \sqrt{re \cdot re + im \cdot im}\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \left(2 \cdot \sqrt{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 (<= re -2.0399582988562903e+105)
(* 0.5 (/ (* (sqrt 2.0) (fabs im)) (sqrt (* re -2.0))))
(if (<= re -5.497046773567483e-226)
(*
0.5
(*
(sqrt (sqrt 2.0))
(/
(* (fabs im) (sqrt (sqrt 2.0)))
(sqrt (- (sqrt (+ (* re re) (* im im))) re)))))
(if (<= re 8.65010257179912e-262)
(* 0.5 (sqrt (* 2.0 (+ re im))))
(if (<= re 3.0513166345511567e-168)
(* 0.5 (sqrt (* 2.0 (- re im))))
(if (<= re 1.6419980517252478e+115)
(* 0.5 (sqrt (* 2.0 (+ re (sqrt (+ (* re re) (* im im)))))))
(* 0.5 (* 2.0 (sqrt 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 (re <= -2.0399582988562903e+105) {
tmp = 0.5 * ((sqrt(2.0) * fabs(im)) / sqrt(re * -2.0));
} else if (re <= -5.497046773567483e-226) {
tmp = 0.5 * (sqrt(sqrt(2.0)) * ((fabs(im) * sqrt(sqrt(2.0))) / sqrt(sqrt((re * re) + (im * im)) - re)));
} else if (re <= 8.65010257179912e-262) {
tmp = 0.5 * sqrt(2.0 * (re + im));
} else if (re <= 3.0513166345511567e-168) {
tmp = 0.5 * sqrt(2.0 * (re - im));
} else if (re <= 1.6419980517252478e+115) {
tmp = 0.5 * sqrt(2.0 * (re + sqrt((re * re) + (im * im))));
} else {
tmp = 0.5 * (2.0 * sqrt(re));
}
return tmp;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.6 |
|---|---|
| Target | 33.5 |
| Herbie | 18.3 |
if re < -2.03995829885629026e105Initial program 60.9
rmApplied flip-+_binary64_243960.9
Applied associate-*r/_binary64_240760.9
Applied sqrt-div_binary64_248260.9
Simplified44.2
rmApplied sqrt-prod_binary64_248144.3
Simplified42.0
Taylor expanded around -inf 10.5
Simplified10.5
if -2.03995829885629026e105 < re < -5.49704677356748332e-226Initial program 39.8
rmApplied flip-+_binary64_243939.6
Applied associate-*r/_binary64_240739.7
Applied sqrt-div_binary64_248239.8
Simplified29.0
rmApplied sqrt-prod_binary64_248129.0
Simplified18.0
rmApplied add-sqr-sqrt_binary64_248718.1
Applied associate-*l*_binary64_240618.1
Simplified18.1
rmApplied *-un-lft-identity_binary64_246518.1
Applied times-frac_binary64_247118.1
if -5.49704677356748332e-226 < re < 8.65010257179912007e-262Initial program 30.0
Taylor expanded around 0 33.8
Simplified33.8
if 8.65010257179912007e-262 < re < 3.05131663455115675e-168Initial program 31.5
Taylor expanded around -inf 35.2
if 3.05131663455115675e-168 < re < 1.6419980517252478e115Initial program 16.4
if 1.6419980517252478e115 < re Initial program 54.4
Taylor expanded around 0 11.4
Simplified10.4
Final simplification18.3
herbie shell --seed 2021098
(FPCore (re im)
:name "math.sqrt on complex, real part"
:precision binary64
:herbie-target
(if (< re 0.0) (* 0.5 (* (sqrt 2.0) (sqrt (/ (* im im) (- (sqrt (+ (* re re) (* im im))) re))))) (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
(* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))