Average Error: 31.4 → 17.4
Time: 1.8s
Precision: 64
\[\sqrt{re \cdot re + im \cdot im}\]
\[\begin{array}{l} \mathbf{if}\;im \le -2.8884266593894412 \cdot 10^{145}:\\ \;\;\;\;-1 \cdot im\\ \mathbf{elif}\;im \le -8.59044981858877489 \cdot 10^{-223}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{elif}\;im \le 3.3111519867076028 \cdot 10^{-267}:\\ \;\;\;\;-1 \cdot re\\ \mathbf{elif}\;im \le 4.35781193024123746 \cdot 10^{99}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{else}:\\ \;\;\;\;im\\ \end{array}\]
\sqrt{re \cdot re + im \cdot im}
\begin{array}{l}
\mathbf{if}\;im \le -2.8884266593894412 \cdot 10^{145}:\\
\;\;\;\;-1 \cdot im\\

\mathbf{elif}\;im \le -8.59044981858877489 \cdot 10^{-223}:\\
\;\;\;\;\sqrt{re \cdot re + im \cdot im}\\

\mathbf{elif}\;im \le 3.3111519867076028 \cdot 10^{-267}:\\
\;\;\;\;-1 \cdot re\\

\mathbf{elif}\;im \le 4.35781193024123746 \cdot 10^{99}:\\
\;\;\;\;\sqrt{re \cdot re + im \cdot im}\\

\mathbf{else}:\\
\;\;\;\;im\\

\end{array}
double f(double re, double im) {
        double r52028 = re;
        double r52029 = r52028 * r52028;
        double r52030 = im;
        double r52031 = r52030 * r52030;
        double r52032 = r52029 + r52031;
        double r52033 = sqrt(r52032);
        return r52033;
}

double f(double re, double im) {
        double r52034 = im;
        double r52035 = -2.888426659389441e+145;
        bool r52036 = r52034 <= r52035;
        double r52037 = -1.0;
        double r52038 = r52037 * r52034;
        double r52039 = -8.590449818588775e-223;
        bool r52040 = r52034 <= r52039;
        double r52041 = re;
        double r52042 = r52041 * r52041;
        double r52043 = r52034 * r52034;
        double r52044 = r52042 + r52043;
        double r52045 = sqrt(r52044);
        double r52046 = 3.311151986707603e-267;
        bool r52047 = r52034 <= r52046;
        double r52048 = r52037 * r52041;
        double r52049 = 4.3578119302412375e+99;
        bool r52050 = r52034 <= r52049;
        double r52051 = r52050 ? r52045 : r52034;
        double r52052 = r52047 ? r52048 : r52051;
        double r52053 = r52040 ? r52045 : r52052;
        double r52054 = r52036 ? r52038 : r52053;
        return r52054;
}

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 im < -2.888426659389441e+145

    1. Initial program 61.0

      \[\sqrt{re \cdot re + im \cdot im}\]
    2. Using strategy rm
    3. Applied flip-+64.0

      \[\leadsto \sqrt{\color{blue}{\frac{\left(re \cdot re\right) \cdot \left(re \cdot re\right) - \left(im \cdot im\right) \cdot \left(im \cdot im\right)}{re \cdot re - im \cdot im}}}\]
    4. Simplified64.0

      \[\leadsto \sqrt{\frac{\color{blue}{\left(-{im}^{3}\right) \cdot im + {re}^{4}}}{re \cdot re - im \cdot im}}\]
    5. Taylor expanded around -inf 7.4

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

    if -2.888426659389441e+145 < im < -8.590449818588775e-223 or 3.311151986707603e-267 < im < 4.3578119302412375e+99

    1. Initial program 19.3

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

    if -8.590449818588775e-223 < im < 3.311151986707603e-267

    1. Initial program 30.2

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

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

    if 4.3578119302412375e+99 < im

    1. Initial program 50.7

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

      \[\leadsto \color{blue}{im}\]
  3. Recombined 4 regimes into one program.
  4. Final simplification17.4

    \[\leadsto \begin{array}{l} \mathbf{if}\;im \le -2.8884266593894412 \cdot 10^{145}:\\ \;\;\;\;-1 \cdot im\\ \mathbf{elif}\;im \le -8.59044981858877489 \cdot 10^{-223}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{elif}\;im \le 3.3111519867076028 \cdot 10^{-267}:\\ \;\;\;\;-1 \cdot re\\ \mathbf{elif}\;im \le 4.35781193024123746 \cdot 10^{99}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{else}:\\ \;\;\;\;im\\ \end{array}\]

Reproduce

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