\sqrt{re \cdot re + im \cdot im}\begin{array}{l}
\mathbf{if}\;im \leq -1.1325242560558167 \cdot 10^{+35}:\\
\;\;\;\;-im\\
\mathbf{elif}\;im \leq -5.718831503715847 \cdot 10^{-283}:\\
\;\;\;\;\sqrt{re \cdot re + im \cdot im}\\
\mathbf{elif}\;im \leq 1.0524581835653178 \cdot 10^{-248}:\\
\;\;\;\;\frac{im \cdot im}{re} \cdot -0.5 - re\\
\mathbf{elif}\;im \leq 1.4546659687059033 \cdot 10^{+125}:\\
\;\;\;\;\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 -1.1325242560558167e+35)
(- im)
(if (<= im -5.718831503715847e-283)
(sqrt (+ (* re re) (* im im)))
(if (<= im 1.0524581835653178e-248)
(- (* (/ (* im im) re) -0.5) re)
(if (<= im 1.4546659687059033e+125)
(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 <= -1.1325242560558167e+35) {
tmp = -im;
} else if (im <= -5.718831503715847e-283) {
tmp = sqrt((re * re) + (im * im));
} else if (im <= 1.0524581835653178e-248) {
tmp = (((im * im) / re) * -0.5) - re;
} else if (im <= 1.4546659687059033e+125) {
tmp = sqrt((re * re) + (im * im));
} else {
tmp = im;
}
return tmp;
}



Bits error versus re



Bits error versus im
Results
if im < -1.13252425605581673e35Initial program 43.0
Taylor expanded around -inf 12.9
Simplified12.9
if -1.13252425605581673e35 < im < -5.7188315037158467e-283 or 1.05245818356531775e-248 < im < 1.4546659687059033e125Initial program 20.4
if -5.7188315037158467e-283 < im < 1.05245818356531775e-248Initial program 31.2
Taylor expanded around -inf 32.6
Simplified32.6
if 1.4546659687059033e125 < im Initial program 56.6
Taylor expanded around 0 8.6
Final simplification17.8
herbie shell --seed 2021042
(FPCore (re im)
:name "math.abs on complex"
:precision binary64
(sqrt (+ (* re re) (* im im))))