0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;im \leq -1.6284670281102737 \cdot 10^{+53}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re - im\right)}\\
\mathbf{elif}\;im \leq -7.594043707095321 \cdot 10^{-114}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + \sqrt{\sqrt{re \cdot re + im \cdot im}} \cdot \sqrt{\sqrt{re \cdot re + im \cdot im}}\right)}\\
\mathbf{elif}\;im \leq -9.515876010320053 \cdot 10^{-305}:\\
\;\;\;\;\frac{im \cdot \sqrt{2}}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}} \cdot -0.5\\
\mathbf{elif}\;im \leq 4.4753072681602385 \cdot 10^{-164}:\\
\;\;\;\;0.5 \cdot \left(2 \cdot \sqrt{re}\right)\\
\mathbf{elif}\;im \leq 2.379531245742764 \cdot 10^{-10}:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{2}}{\frac{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}{im}}\\
\mathbf{elif}\;im \leq 5.860124411478432 \cdot 10^{+28}:\\
\;\;\;\;0.5 \cdot \left(2 \cdot \sqrt{re}\right)\\
\mathbf{elif}\;im \leq 1.5184799493309332 \cdot 10^{+111}:\\
\;\;\;\;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(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 (<= im -1.6284670281102737e+53)
(* 0.5 (sqrt (* 2.0 (- re im))))
(if (<= im -7.594043707095321e-114)
(*
0.5
(sqrt
(*
2.0
(+
re
(*
(sqrt (sqrt (+ (* re re) (* im im))))
(sqrt (sqrt (+ (* re re) (* im im)))))))))
(if (<= im -9.515876010320053e-305)
(*
(/ (* im (sqrt 2.0)) (sqrt (- (sqrt (+ (* re re) (* im im))) re)))
-0.5)
(if (<= im 4.4753072681602385e-164)
(* 0.5 (* 2.0 (sqrt re)))
(if (<= im 2.379531245742764e-10)
(*
0.5
(/ (sqrt 2.0) (/ (sqrt (- (sqrt (+ (* re re) (* im im))) re)) im)))
(if (<= im 5.860124411478432e+28)
(* 0.5 (* 2.0 (sqrt re)))
(if (<= im 1.5184799493309332e+111)
(* 0.5 (sqrt (* 2.0 (+ re (sqrt (+ (* re re) (* im im)))))))
(* 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 (im <= -1.6284670281102737e+53) {
tmp = 0.5 * sqrt(2.0 * (re - im));
} else if (im <= -7.594043707095321e-114) {
tmp = 0.5 * sqrt(2.0 * (re + (sqrt(sqrt((re * re) + (im * im))) * sqrt(sqrt((re * re) + (im * im))))));
} else if (im <= -9.515876010320053e-305) {
tmp = ((im * sqrt(2.0)) / sqrt(sqrt((re * re) + (im * im)) - re)) * -0.5;
} else if (im <= 4.4753072681602385e-164) {
tmp = 0.5 * (2.0 * sqrt(re));
} else if (im <= 2.379531245742764e-10) {
tmp = 0.5 * (sqrt(2.0) / (sqrt(sqrt((re * re) + (im * im)) - re) / im));
} else if (im <= 5.860124411478432e+28) {
tmp = 0.5 * (2.0 * sqrt(re));
} else if (im <= 1.5184799493309332e+111) {
tmp = 0.5 * sqrt(2.0 * (re + sqrt((re * re) + (im * im))));
} else {
tmp = 0.5 * sqrt(2.0 * (im + re));
}
return tmp;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.2 |
|---|---|
| Target | 33.1 |
| Herbie | 23.4 |
if im < -1.6284670281102737e53Initial program 45.2
Taylor expanded around -inf 12.3
Simplified12.3
if -1.6284670281102737e53 < im < -7.59404370709532149e-114Initial program 24.4
rmApplied add-sqr-sqrt_binary6424.6
if -7.59404370709532149e-114 < im < -9.51587601032005312e-305Initial program 42.1
rmApplied flip-+_binary6457.4
Applied associate-*r/_binary6457.4
Applied sqrt-div_binary6457.7
Simplified49.6
Taylor expanded around -inf 39.1
Simplified39.1
if -9.51587601032005312e-305 < im < 4.47530726816023846e-164 or 2.37953124574276406e-10 < im < 5.86012441147843165e28Initial program 38.9
Taylor expanded around 0 36.3
Simplified35.8
if 4.47530726816023846e-164 < im < 2.37953124574276406e-10Initial program 28.5
rmApplied flip-+_binary6440.1
Applied associate-*r/_binary6440.1
Applied sqrt-div_binary6440.2
Simplified27.2
rmApplied sqrt-prod_binary6427.3
Applied associate-/l*_binary6427.3
Simplified26.6
if 5.86012441147843165e28 < im < 1.5184799493309332e111Initial program 19.2
if 1.5184799493309332e111 < im Initial program 52.5
Taylor expanded around 0 9.5
Final simplification23.4
herbie shell --seed 2021173
(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)))))