\sqrt{re \cdot re + im \cdot im}
\begin{array}{l}
\mathbf{if}\;im \leq 4.776300407843372 \cdot 10^{-164}:\\
\;\;\;\;-re\\
\mathbf{elif}\;im \leq 2.5184939753787586 \cdot 10^{+113}:\\
\;\;\;\;\sqrt{re \cdot re + im \cdot im}\\
\mathbf{else}:\\
\;\;\;\;im\\
\end{array}
(FPCore modulus (re im) :precision binary64 (sqrt (+ (* re re) (* im im))))
(FPCore modulus (re im) :precision binary64 (if (<= im 4.776300407843372e-164) (- re) (if (<= im 2.5184939753787586e+113) (sqrt (+ (* re re) (* im im))) im)))
double modulus(double re, double im) {
return sqrt((re * re) + (im * im));
}
double modulus(double re, double im) {
double tmp;
if (im <= 4.776300407843372e-164) {
tmp = -re;
} else if (im <= 2.5184939753787586e+113) {
tmp = sqrt((re * re) + (im * im));
} else {
tmp = im;
}
return tmp;
}



Bits error versus re



Bits error versus im
Results
if im < 4.7763004078433717e-164Initial program 32.5
Taylor expanded around -inf 5.4
Simplified5.4
if 4.7763004078433717e-164 < im < 2.51849397537875859e113Initial program 11.5
if 2.51849397537875859e113 < im Initial program 53.4
Taylor expanded around 0 4.9
Final simplification7.2
herbie shell --seed 2021207
(FPCore modulus (re im)
:name "math.abs on complex"
:precision binary64
(sqrt (+ (* re re) (* im im))))