\sqrt{re \cdot re + im \cdot im}\begin{array}{l}
\mathbf{if}\;re \leq -6.518081105388684 \cdot 10^{+114}:\\
\;\;\;\;-re\\
\mathbf{elif}\;re \leq -4.142924173025851 \cdot 10^{-210}:\\
\;\;\;\;\sqrt{re \cdot re + im \cdot im}\\
\mathbf{elif}\;re \leq 6.004365564520266 \cdot 10^{-207}:\\
\;\;\;\;im\\
\mathbf{elif}\;re \leq 42148.37987214342:\\
\;\;\;\;\sqrt{re \cdot re + im \cdot im}\\
\mathbf{else}:\\
\;\;\;\;re\\
\end{array}(FPCore (re im) :precision binary64 (sqrt (+ (* re re) (* im im))))
(FPCore (re im)
:precision binary64
(if (<= re -6.518081105388684e+114)
(- re)
(if (<= re -4.142924173025851e-210)
(sqrt (+ (* re re) (* im im)))
(if (<= re 6.004365564520266e-207)
im
(if (<= re 42148.37987214342) (sqrt (+ (* re re) (* im im))) re)))))double code(double re, double im) {
return sqrt((re * re) + (im * im));
}
double code(double re, double im) {
double tmp;
if (re <= -6.518081105388684e+114) {
tmp = -re;
} else if (re <= -4.142924173025851e-210) {
tmp = sqrt((re * re) + (im * im));
} else if (re <= 6.004365564520266e-207) {
tmp = im;
} else if (re <= 42148.37987214342) {
tmp = sqrt((re * re) + (im * im));
} else {
tmp = re;
}
return tmp;
}



Bits error versus re



Bits error versus im
Results
if re < -6.51805e114Initial program 53.7
Taylor expanded around -inf 10.5
Simplified10.5
if -6.51805e114 < re < -4.14295e-210 or 6.00441e-207 < re < 42148Initial program 18.8
if -4.14295e-210 < re < 6.00441e-207Initial program 30.0
Taylor expanded around 0 32.9
if 42148 < re Initial program 40.5
Taylor expanded around inf 14.7
Final simplification18.8
herbie shell --seed 2020231
(FPCore (re im)
:name "math.abs on complex"
:precision binary64
(sqrt (+ (* re re) (* im im))))