0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\begin{array}{l}
\mathbf{if}\;\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)} \leq 0:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{2 \cdot \left(im \cdot im\right)}}{\sqrt{re + \sqrt{re \cdot re + im \cdot im}}}\\
\mathbf{elif}\;\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)} \leq 8.866564380277741 \cdot 10^{+71}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\left|\sqrt{re \cdot re + im \cdot im}\right| - re\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 (<= (sqrt (* 2.0 (- (sqrt (+ (* re re) (* im im))) re))) 0.0)
(*
0.5
(/ (sqrt (* 2.0 (* im im))) (sqrt (+ re (sqrt (+ (* re re) (* im im)))))))
(if (<=
(sqrt (* 2.0 (- (sqrt (+ (* re re) (* im im))) re)))
8.866564380277741e+71)
(* 0.5 (sqrt (* 2.0 (- (fabs (sqrt (+ (* re re) (* im im)))) re))))
(* 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 (sqrt(2.0 * (sqrt((re * re) + (im * im)) - re)) <= 0.0) {
tmp = 0.5 * (sqrt(2.0 * (im * im)) / sqrt(re + sqrt((re * re) + (im * im))));
} else if (sqrt(2.0 * (sqrt((re * re) + (im * im)) - re)) <= 8.866564380277741e+71) {
tmp = 0.5 * sqrt(2.0 * (fabs(sqrt((re * re) + (im * im))) - re));
} else {
tmp = 0.5 * sqrt(2.0 * (im - re));
}
return tmp;
}










Bits error versus re










Bits error versus im
Results
| Alternative 1 | |
|---|---|
| Accuracy | 19.2 |
| Cost | 2946 |
| Alternative 2 | |
|---|---|
| Accuracy | 22.3 |
| Cost | 2562 |
| Alternative 3 | |
|---|---|
| Accuracy | 22.4 |
| Cost | 1985 |
| Alternative 4 | |
|---|---|
| Accuracy | 22.5 |
| Cost | 2561 |
| Alternative 5 | |
|---|---|
| Accuracy | 24.5 |
| Cost | 1921 |
| Alternative 6 | |
|---|---|
| Accuracy | 38.5 |
| Cost | 1024 |
| Alternative 7 | |
|---|---|
| Accuracy | 64.0 |
| Cost | 1472 |
if (sqrt.f64 (*.f64 2 (-.f64 (sqrt.f64 (+.f64 (*.f64 re re) (*.f64 im im))) re))) < 0.0Initial program 57.5
rmApplied flip--_binary64_39457.5
Applied associate-*r/_binary64_36157.5
Applied sqrt-div_binary64_43657.5
Simplified26.7
Simplified26.7
if 0.0 < (sqrt.f64 (*.f64 2 (-.f64 (sqrt.f64 (+.f64 (*.f64 re re) (*.f64 im im))) re))) < 8.866564380277741e71Initial program 4.1
rmApplied add-sqr-sqrt_binary64_4414.1
Applied rem-sqrt-square_binary64_4324.1
if 8.866564380277741e71 < (sqrt.f64 (*.f64 2 (-.f64 (sqrt.f64 (+.f64 (*.f64 re re) (*.f64 im im))) re))) Initial program 61.4
Taylor expanded around 0 28.6
rmApplied *-un-lft-identity_binary64_41928.6
Final simplification18.8
herbie shell --seed 2020322
(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)))))