Average Error: 31.7 → 18.2
Time: 1.2s
Precision: 64
\[\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}\]
\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;
}

Error

Bits error versus re

Bits error versus im

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Derivation

  1. Split input into 4 regimes
  2. if re < -7.760468085811197e+47

    1. Initial program 44.8

      \[\sqrt{re \cdot re + im \cdot im}\]
    2. Taylor expanded around -inf 13.0

      \[\leadsto \color{blue}{-1 \cdot re}\]

    if -7.760468085811197e+47 < re < -5.89967699622497e-185 or 2.570866863735433e-296 < re < 3.6290218343013444e+121

    1. Initial program 19.7

      \[\sqrt{re \cdot re + im \cdot im}\]

    if -5.89967699622497e-185 < re < 2.570866863735433e-296

    1. Initial program 30.5

      \[\sqrt{re \cdot re + im \cdot im}\]
    2. Taylor expanded around 0 33.6

      \[\leadsto \color{blue}{im}\]

    if 3.6290218343013444e+121 < re

    1. Initial program 55.6

      \[\sqrt{re \cdot re + im \cdot im}\]
    2. Taylor expanded around inf 9.1

      \[\leadsto \color{blue}{re}\]
  3. Recombined 4 regimes into one program.
  4. Final simplification18.2

    \[\leadsto \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}\]

Reproduce

herbie shell --seed 2019318 
(FPCore (re im)
  :name "math.abs on complex"
  :precision binary64
  (sqrt (+ (* re re) (* im im))))