\sqrt{re \cdot re + im \cdot im}\begin{array}{l}
\mathbf{if}\;im \leq 2.715301714894546 \cdot 10^{-140}:\\
\;\;\;\;-re\\
\mathbf{elif}\;im \leq 1.0282379563465237 \cdot 10^{+127}:\\
\;\;\;\;\sqrt{re \cdot re + im \cdot im}\\
\mathbf{else}:\\
\;\;\;\;im\\
\end{array}(FPCore (re im) :precision binary64 (sqrt (+ (* re re) (* im im))))
(FPCore (re im) :precision binary64 (if (<= im 2.715301714894546e-140) (- re) (if (<= im 1.0282379563465237e+127) (sqrt (+ (* re re) (* im im))) im)))
double code(double re, double im) {
return sqrt((re * re) + (im * im));
}
double code(double re, double im) {
double tmp;
if (im <= 2.715301714894546e-140) {
tmp = -re;
} else if (im <= 1.0282379563465237e+127) {
tmp = sqrt((re * re) + (im * im));
} else {
tmp = im;
}
return tmp;
}



Bits error versus re



Bits error versus im
Results
if im < 2.7153017148945459e-140Initial program 31.6
Taylor expanded around -inf 6.3
Simplified6.3
if 2.7153017148945459e-140 < im < 1.02823795634652372e127Initial program 10.7
if 1.02823795634652372e127 < im Initial program 55.4
Taylor expanded around 0 4.9
Final simplification7.3
herbie shell --seed 2020358
(FPCore (re im)
:name "math.abs on complex"
:precision binary64
(sqrt (+ (* re re) (* im im))))