0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}
\begin{array}{l}
\mathbf{if}\;re \leq -7.202903839708791 \cdot 10^{+126}:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{2} \cdot \left|im\right|}{\sqrt{\left(-re\right) - re}}\\
\mathbf{elif}\;re \leq -3.7129649888112956 \cdot 10^{-283}:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{\sqrt{2}} \cdot \left(\left|im\right| \cdot \sqrt{\sqrt{2}}\right)}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}\\
\mathbf{elif}\;re \leq 1.0165515961308099 \cdot 10^{-218}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re - \left(im + 0.5 \cdot \frac{{re}^{2}}{im}\right)\right)}\\
\mathbf{elif}\;re \leq 5.269431306839334 \cdot 10^{+131}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + \sqrt{re \cdot re + im \cdot im}\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + 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 -7.202903839708791e+126)
(* 0.5 (/ (* (sqrt 2.0) (fabs im)) (sqrt (- (- re) re))))
(if (<= re -3.7129649888112956e-283)
(*
0.5
(/
(* (sqrt (sqrt 2.0)) (* (fabs im) (sqrt (sqrt 2.0))))
(sqrt (- (sqrt (+ (* re re) (* im im))) re))))
(if (<= re 1.0165515961308099e-218)
(* 0.5 (sqrt (* 2.0 (- re (+ im (* 0.5 (/ (pow re 2.0) im)))))))
(if (<= re 5.269431306839334e+131)
(* 0.5 (sqrt (* 2.0 (+ re (sqrt (+ (* re re) (* im im)))))))
(* 0.5 (sqrt (* 2.0 (+ re 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 <= -7.202903839708791e+126) {
tmp = 0.5 * ((sqrt(2.0) * fabs(im)) / sqrt(-re - re));
} else if (re <= -3.7129649888112956e-283) {
tmp = 0.5 * ((sqrt(sqrt(2.0)) * (fabs(im) * sqrt(sqrt(2.0)))) / sqrt(sqrt((re * re) + (im * im)) - re));
} else if (re <= 1.0165515961308099e-218) {
tmp = 0.5 * sqrt(2.0 * (re - (im + (0.5 * (pow(re, 2.0) / im)))));
} else if (re <= 5.269431306839334e+131) {
tmp = 0.5 * sqrt(2.0 * (re + sqrt((re * re) + (im * im))));
} else {
tmp = 0.5 * sqrt(2.0 * (re + re));
}
return tmp;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.6 |
|---|---|
| Target | 33.9 |
| Herbie | 17.8 |
if re < -7.20290383970879145e126Initial program 62.3
rmApplied flip-+_binary64_209862.3
Applied associate-*r/_binary64_206662.3
Applied sqrt-div_binary64_214162.3
Simplified47.3
rmApplied sqrt-prod_binary64_214047.3
Simplified45.6
Taylor expanded around -inf 9.1
Simplified9.1
if -7.20290383970879145e126 < re < -3.71296498881129564e-283Initial program 40.2
rmApplied flip-+_binary64_209840.0
Applied associate-*r/_binary64_206640.0
Applied sqrt-div_binary64_214140.1
Simplified30.9
rmApplied sqrt-prod_binary64_214031.0
Simplified20.2
rmApplied add-sqr-sqrt_binary64_214620.2
Applied associate-*l*_binary64_206520.2
if -3.71296498881129564e-283 < re < 1.0165515961308099e-218Initial program 32.1
Taylor expanded around -inf 33.8
if 1.0165515961308099e-218 < re < 5.26943130683933404e131Initial program 17.9
if 5.26943130683933404e131 < re Initial program 57.2
Taylor expanded around inf 8.9
Final simplification17.8
herbie shell --seed 2021210
(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)))))