0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;im \leq -1.8027506436573165 \cdot 10^{+31}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re - im\right)}\\
\mathbf{elif}\;im \leq -3.4993194957776107 \cdot 10^{-161}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + \sqrt{re \cdot re + im \cdot im}\right)}\\
\mathbf{elif}\;im \leq -1.1367816435235204 \cdot 10^{-191}:\\
\;\;\;\;0.5 \cdot \left(2 \cdot \sqrt{re}\right)\\
\mathbf{elif}\;im \leq 8.572356981549358 \cdot 10^{-176}:\\
\;\;\;\;0.5 \cdot \frac{\left|im\right| \cdot \sqrt{2}}{\sqrt{re \cdot -2}}\\
\mathbf{elif}\;im \leq 3.24503967386611 \cdot 10^{-149}:\\
\;\;\;\;0.5 \cdot \left(2 \cdot \sqrt{re}\right)\\
\mathbf{elif}\;im \leq 1.4299984141510836 \cdot 10^{-124}:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{2 \cdot \left(im \cdot im\right)}}{\sqrt{re \cdot -2}}\\
\mathbf{elif}\;im \leq 2.4066168209035574 \cdot 10^{-44}:\\
\;\;\;\;0.5 \cdot \frac{\left|im\right|}{\frac{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}{\sqrt{2}}}\\
\mathbf{elif}\;im \leq 3.641911564658625 \cdot 10^{+70}:\\
\;\;\;\;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.8027506436573165e+31)
(* 0.5 (sqrt (* 2.0 (- re im))))
(if (<= im -3.4993194957776107e-161)
(* 0.5 (sqrt (* 2.0 (+ re (sqrt (+ (* re re) (* im im)))))))
(if (<= im -1.1367816435235204e-191)
(* 0.5 (* 2.0 (sqrt re)))
(if (<= im 8.572356981549358e-176)
(* 0.5 (/ (* (fabs im) (sqrt 2.0)) (sqrt (* re -2.0))))
(if (<= im 3.24503967386611e-149)
(* 0.5 (* 2.0 (sqrt re)))
(if (<= im 1.4299984141510836e-124)
(* 0.5 (/ (sqrt (* 2.0 (* im im))) (sqrt (* re -2.0))))
(if (<= im 2.4066168209035574e-44)
(*
0.5
(/
(fabs im)
(/ (sqrt (- (sqrt (+ (* re re) (* im im))) re)) (sqrt 2.0))))
(if (<= im 3.641911564658625e+70)
(* 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.8027506436573165e+31) {
tmp = 0.5 * sqrt(2.0 * (re - im));
} else if (im <= -3.4993194957776107e-161) {
tmp = 0.5 * sqrt(2.0 * (re + sqrt((re * re) + (im * im))));
} else if (im <= -1.1367816435235204e-191) {
tmp = 0.5 * (2.0 * sqrt(re));
} else if (im <= 8.572356981549358e-176) {
tmp = 0.5 * ((fabs(im) * sqrt(2.0)) / sqrt(re * -2.0));
} else if (im <= 3.24503967386611e-149) {
tmp = 0.5 * (2.0 * sqrt(re));
} else if (im <= 1.4299984141510836e-124) {
tmp = 0.5 * (sqrt(2.0 * (im * im)) / sqrt(re * -2.0));
} else if (im <= 2.4066168209035574e-44) {
tmp = 0.5 * (fabs(im) / (sqrt(sqrt((re * re) + (im * im)) - re) / sqrt(2.0)));
} else if (im <= 3.641911564658625e+70) {
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.9 |
|---|---|
| Target | 33.9 |
| Herbie | 22.7 |
if im < -1.80275064365731655e31Initial program 44.0
Taylor expanded around -inf 13.6
if -1.80275064365731655e31 < im < -3.49931949577761071e-161 or 2.4066168209035574e-44 < im < 3.6419115646586251e70Initial program 25.1
if -3.49931949577761071e-161 < im < -1.1367816435235204e-191 or 8.57235698154935808e-176 < im < 3.24503967386610997e-149Initial program 39.1
Taylor expanded around 0 34.6
Simplified34.1
if -1.1367816435235204e-191 < im < 8.57235698154935808e-176Initial program 42.8
rmApplied flip-+_binary64_312160.0
Applied associate-*r/_binary64_308960.0
Applied sqrt-div_binary64_316460.3
Simplified53.3
rmApplied sqrt-prod_binary64_316353.3
Simplified39.3
Taylor expanded around -inf 35.2
Simplified35.2
if 3.24503967386610997e-149 < im < 1.42999841415108362e-124Initial program 34.1
rmApplied flip-+_binary64_312146.5
Applied associate-*r/_binary64_308946.5
Applied sqrt-div_binary64_316446.5
Simplified32.8
Taylor expanded around -inf 42.4
Simplified42.4
if 1.42999841415108362e-124 < im < 2.4066168209035574e-44Initial program 31.2
rmApplied flip-+_binary64_312141.4
Applied associate-*r/_binary64_308941.4
Applied sqrt-div_binary64_316441.5
Simplified27.4
rmApplied sqrt-prod_binary64_316327.4
Simplified27.4
rmApplied associate-/l*_binary64_309227.4
if 3.6419115646586251e70 < im Initial program 48.5
Taylor expanded around 0 12.0
Final simplification22.7
herbie shell --seed 2021009
(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)))))