Average Error: 29.1 → 16.5
Time: 8.7s
Precision: 64
\[\sqrt{re \cdot re + im \cdot im}\]
\[\begin{array}{l} \mathbf{if}\;re \le -4.129850026901925 \cdot 10^{+87}:\\ \;\;\;\;-re\\ \mathbf{elif}\;re \le 9.783014267098546 \cdot 10^{+150}:\\ \;\;\;\;\sqrt{im \cdot im + re \cdot re}\\ \mathbf{else}:\\ \;\;\;\;re\\ \end{array}\]
double f(double re, double im) {
        double r1682152 = re;
        double r1682153 = r1682152 * r1682152;
        double r1682154 = im;
        double r1682155 = r1682154 * r1682154;
        double r1682156 = r1682153 + r1682155;
        double r1682157 = sqrt(r1682156);
        return r1682157;
}

double f(double re, double im) {
        double r1682158 = re;
        double r1682159 = -4.129850026901925e+87;
        bool r1682160 = r1682158 <= r1682159;
        double r1682161 = -r1682158;
        double r1682162 = 9.783014267098546e+150;
        bool r1682163 = r1682158 <= r1682162;
        double r1682164 = im;
        double r1682165 = r1682164 * r1682164;
        double r1682166 = r1682158 * r1682158;
        double r1682167 = r1682165 + r1682166;
        double r1682168 = sqrt(r1682167);
        double r1682169 = r1682163 ? r1682168 : r1682158;
        double r1682170 = r1682160 ? r1682161 : r1682169;
        return r1682170;
}

\sqrt{re \cdot re + im \cdot im}
\begin{array}{l}
\mathbf{if}\;re \le -4.129850026901925 \cdot 10^{+87}:\\
\;\;\;\;-re\\

\mathbf{elif}\;re \le 9.783014267098546 \cdot 10^{+150}:\\
\;\;\;\;\sqrt{im \cdot im + re \cdot re}\\

\mathbf{else}:\\
\;\;\;\;re\\

\end{array}

Error

Bits error versus re

Bits error versus im

Derivation

  1. Split input into 3 regimes
  2. if re < -4.129850026901925e+87

    1. Initial program 45.9

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

      \[\leadsto \color{blue}{-1 \cdot re}\]
    3. Simplified10.4

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

    if -4.129850026901925e+87 < re < 9.783014267098546e+150

    1. Initial program 19.5

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

    if 9.783014267098546e+150 < re

    1. Initial program 58.2

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -4.129850026901925 \cdot 10^{+87}:\\ \;\;\;\;-re\\ \mathbf{elif}\;re \le 9.783014267098546 \cdot 10^{+150}:\\ \;\;\;\;\sqrt{im \cdot im + re \cdot re}\\ \mathbf{else}:\\ \;\;\;\;re\\ \end{array}\]

Reproduce

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