\sqrt{re \cdot re + im \cdot im}\begin{array}{l}
\mathbf{if}\;re \le -7.76046808581119742207882133243897814791 \cdot 10^{47}:\\
\;\;\;\;-1 \cdot re\\
\mathbf{elif}\;re \le -5.899676996224969797473356094348485392996 \cdot 10^{-185}:\\
\;\;\;\;\sqrt{re \cdot re + im \cdot im}\\
\mathbf{elif}\;re \le 2.570866863735433156870358275922364395788 \cdot 10^{-296}:\\
\;\;\;\;im\\
\mathbf{elif}\;re \le 3.629021834301344361694623304417316639458 \cdot 10^{121}:\\
\;\;\;\;\sqrt{re \cdot re + im \cdot im}\\
\mathbf{else}:\\
\;\;\;\;re\\
\end{array}double f(double re, double im) {
double r54269 = re;
double r54270 = r54269 * r54269;
double r54271 = im;
double r54272 = r54271 * r54271;
double r54273 = r54270 + r54272;
double r54274 = sqrt(r54273);
return r54274;
}
double f(double re, double im) {
double r54275 = re;
double r54276 = -7.760468085811197e+47;
bool r54277 = r54275 <= r54276;
double r54278 = -1.0;
double r54279 = r54278 * r54275;
double r54280 = -5.89967699622497e-185;
bool r54281 = r54275 <= r54280;
double r54282 = r54275 * r54275;
double r54283 = im;
double r54284 = r54283 * r54283;
double r54285 = r54282 + r54284;
double r54286 = sqrt(r54285);
double r54287 = 2.570866863735433e-296;
bool r54288 = r54275 <= r54287;
double r54289 = 3.6290218343013444e+121;
bool r54290 = r54275 <= r54289;
double r54291 = r54290 ? r54286 : r54275;
double r54292 = r54288 ? r54283 : r54291;
double r54293 = r54281 ? r54286 : r54292;
double r54294 = r54277 ? r54279 : r54293;
return r54294;
}



Bits error versus re



Bits error versus im
Results
if re < -7.760468085811197e+47Initial program 44.8
Taylor expanded around -inf 13.0
if -7.760468085811197e+47 < re < -5.89967699622497e-185 or 2.570866863735433e-296 < re < 3.6290218343013444e+121Initial program 19.7
if -5.89967699622497e-185 < re < 2.570866863735433e-296Initial program 30.5
Taylor expanded around 0 33.6
if 3.6290218343013444e+121 < re Initial program 55.6
Taylor expanded around inf 9.1
Final simplification18.2
herbie shell --seed 2019318
(FPCore (re im)
:name "math.abs on complex"
:precision binary64
(sqrt (+ (* re re) (* im im))))