Average Error: 31.5 → 17.8
Time: 2.9s
Precision: 64
\[\sqrt{re \cdot re + im \cdot im}\]
\[\begin{array}{l} \mathbf{if}\;re \le -1.300285162304908517480300856336753809112 \cdot 10^{108}:\\ \;\;\;\;-1 \cdot re\\ \mathbf{elif}\;re \le 1.865924590141658442437285705670191540248 \cdot 10^{56}:\\ \;\;\;\;\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 -1.300285162304908517480300856336753809112 \cdot 10^{108}:\\
\;\;\;\;-1 \cdot re\\

\mathbf{elif}\;re \le 1.865924590141658442437285705670191540248 \cdot 10^{56}:\\
\;\;\;\;\sqrt{re \cdot re + im \cdot im}\\

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

\end{array}
double f(double re, double im) {
        double r48693 = re;
        double r48694 = r48693 * r48693;
        double r48695 = im;
        double r48696 = r48695 * r48695;
        double r48697 = r48694 + r48696;
        double r48698 = sqrt(r48697);
        return r48698;
}

double f(double re, double im) {
        double r48699 = re;
        double r48700 = -1.3002851623049085e+108;
        bool r48701 = r48699 <= r48700;
        double r48702 = -1.0;
        double r48703 = r48702 * r48699;
        double r48704 = 1.8659245901416584e+56;
        bool r48705 = r48699 <= r48704;
        double r48706 = r48699 * r48699;
        double r48707 = im;
        double r48708 = r48707 * r48707;
        double r48709 = r48706 + r48708;
        double r48710 = sqrt(r48709);
        double r48711 = r48705 ? r48710 : r48699;
        double r48712 = r48701 ? r48703 : r48711;
        return r48712;
}

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 3 regimes
  2. if re < -1.3002851623049085e+108

    1. Initial program 52.3

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

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

    if -1.3002851623049085e+108 < re < 1.8659245901416584e+56

    1. Initial program 21.7

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

    if 1.8659245901416584e+56 < re

    1. Initial program 45.6

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -1.300285162304908517480300856336753809112 \cdot 10^{108}:\\ \;\;\;\;-1 \cdot re\\ \mathbf{elif}\;re \le 1.865924590141658442437285705670191540248 \cdot 10^{56}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{else}:\\ \;\;\;\;re\\ \end{array}\]

Reproduce

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