\sqrt{re \cdot re + im \cdot im}\begin{array}{l}
\mathbf{if}\;im \leq -3.148243747314542 \cdot 10^{+78}:\\
\;\;\;\;-im\\
\mathbf{elif}\;im \leq -6.207988187895342 \cdot 10^{-190}:\\
\;\;\;\;\sqrt{im \cdot im + re \cdot re}\\
\mathbf{elif}\;im \leq -2.4637364856279063 \cdot 10^{-252}:\\
\;\;\;\;\frac{im \cdot im}{re} \cdot -0.5 - re\\
\mathbf{elif}\;im \leq 4.045551410041801 \cdot 10^{-272}:\\
\;\;\;\;re\\
\mathbf{elif}\;im \leq 1.325491675883215 \cdot 10^{-188}:\\
\;\;\;\;\frac{im \cdot im}{re} \cdot -0.5 - re\\
\mathbf{elif}\;im \leq 2.4191264962337645 \cdot 10^{+94}:\\
\;\;\;\;\sqrt{im \cdot im + re \cdot re}\\
\mathbf{else}:\\
\;\;\;\;im\\
\end{array}(FPCore (re im) :precision binary64 (sqrt (+ (* re re) (* im im))))
(FPCore (re im)
:precision binary64
(if (<= im -3.148243747314542e+78)
(- im)
(if (<= im -6.207988187895342e-190)
(sqrt (+ (* im im) (* re re)))
(if (<= im -2.4637364856279063e-252)
(- (* (/ (* im im) re) -0.5) re)
(if (<= im 4.045551410041801e-272)
re
(if (<= im 1.325491675883215e-188)
(- (* (/ (* im im) re) -0.5) re)
(if (<= im 2.4191264962337645e+94)
(sqrt (+ (* im im) (* re re)))
im)))))))double code(double re, double im) {
return sqrt((re * re) + (im * im));
}
double code(double re, double im) {
double tmp;
if (im <= -3.148243747314542e+78) {
tmp = -im;
} else if (im <= -6.207988187895342e-190) {
tmp = sqrt((im * im) + (re * re));
} else if (im <= -2.4637364856279063e-252) {
tmp = (((im * im) / re) * -0.5) - re;
} else if (im <= 4.045551410041801e-272) {
tmp = re;
} else if (im <= 1.325491675883215e-188) {
tmp = (((im * im) / re) * -0.5) - re;
} else if (im <= 2.4191264962337645e+94) {
tmp = sqrt((im * im) + (re * re));
} else {
tmp = im;
}
return tmp;
}













Bits error versus re













Bits error versus im
Results
| Alternative 1 | |
|---|---|
| Error | 33.8 |
| Cost | 19648 |
| Alternative 2 | |
|---|---|
| Error | 31.4 |
| Cost | 6848 |
| Alternative 3 | |
|---|---|
| Error | 48.3 |
| Cost | 576 |
| Alternative 4 | |
|---|---|
| Error | 47.1 |
| Cost | 128 |
| Alternative 5 | |
|---|---|
| Error | 46.8 |
| Cost | 128 |
| Alternative 6 | |
|---|---|
| Error | 46.8 |
| Cost | 64 |
| Alternative 7 | |
|---|---|
| Error | 46.7 |
| Cost | 64 |
| Alternative 8 | |
|---|---|
| Error | 60.6 |
| Cost | 64 |
| Alternative 9 | |
|---|---|
| Error | 62.3 |
| Cost | 64 |
| Alternative 10 | |
|---|---|
| Error | 63.2 |
| Cost | 64 |

if im < -3.14824374731454187e78Initial program 48.2
Taylor expanded around -inf 12.2
Simplified12.2
Simplified12.2
if -3.14824374731454187e78 < im < -6.2079881878953418e-190 or 1.32549167588321498e-188 < im < 2.4191264962337645e94Initial program 18.0
Simplified18.0
if -6.2079881878953418e-190 < im < -2.4637364856279063e-252 or 4.0455514100418009e-272 < im < 1.32549167588321498e-188Initial program 28.9
Taylor expanded around -inf 36.4
Simplified36.4
Simplified36.4
if -2.4637364856279063e-252 < im < 4.0455514100418009e-272Initial program 29.6
Taylor expanded around inf 36.4
Simplified36.4
if 2.4191264962337645e94 < im Initial program 49.8
Taylor expanded around 0 9.6
Simplified9.6
Final simplification19.0
herbie shell --seed 2021022
(FPCore (re im)
:name "math.abs on complex"
:precision binary64
(sqrt (+ (* re re) (* im im))))