Average Error: 29.4 → 17.8
Time: 3.7s
Precision: 64
\[\sqrt{re \cdot re + im \cdot im}\]
\[\begin{array}{l} \mathbf{if}\;re \le -2.3301205168757104 \cdot 10^{+153}:\\ \;\;\;\;-re\\ \mathbf{elif}\;re \le -3.728827270067989 \cdot 10^{-149}:\\ \;\;\;\;\sqrt{im \cdot im + re \cdot re}\\ \mathbf{elif}\;re \le 2.0900313658610145 \cdot 10^{-225}:\\ \;\;\;\;im\\ \mathbf{elif}\;re \le 1.1525123229926465 \cdot 10^{+142}:\\ \;\;\;\;\sqrt{im \cdot im + re \cdot re}\\ \mathbf{else}:\\ \;\;\;\;re\\ \end{array}\]
\sqrt{re \cdot re + im \cdot im}
\begin{array}{l}
\mathbf{if}\;re \le -2.3301205168757104 \cdot 10^{+153}:\\
\;\;\;\;-re\\

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

\mathbf{elif}\;re \le 2.0900313658610145 \cdot 10^{-225}:\\
\;\;\;\;im\\

\mathbf{elif}\;re \le 1.1525123229926465 \cdot 10^{+142}:\\
\;\;\;\;\sqrt{im \cdot im + re \cdot re}\\

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

\end{array}
double f(double re, double im) {
        double r862968 = re;
        double r862969 = r862968 * r862968;
        double r862970 = im;
        double r862971 = r862970 * r862970;
        double r862972 = r862969 + r862971;
        double r862973 = sqrt(r862972);
        return r862973;
}

double f(double re, double im) {
        double r862974 = re;
        double r862975 = -2.3301205168757104e+153;
        bool r862976 = r862974 <= r862975;
        double r862977 = -r862974;
        double r862978 = -3.728827270067989e-149;
        bool r862979 = r862974 <= r862978;
        double r862980 = im;
        double r862981 = r862980 * r862980;
        double r862982 = r862974 * r862974;
        double r862983 = r862981 + r862982;
        double r862984 = sqrt(r862983);
        double r862985 = 2.0900313658610145e-225;
        bool r862986 = r862974 <= r862985;
        double r862987 = 1.1525123229926465e+142;
        bool r862988 = r862974 <= r862987;
        double r862989 = r862988 ? r862984 : r862974;
        double r862990 = r862986 ? r862980 : r862989;
        double r862991 = r862979 ? r862984 : r862990;
        double r862992 = r862976 ? r862977 : r862991;
        return r862992;
}

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 < -2.3301205168757104e+153

    1. Initial program 59.2

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

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

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

    if -2.3301205168757104e+153 < re < -3.728827270067989e-149 or 2.0900313658610145e-225 < re < 1.1525123229926465e+142

    1. Initial program 16.2

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

    if -3.728827270067989e-149 < re < 2.0900313658610145e-225

    1. Initial program 29.2

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

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

    if 1.1525123229926465e+142 < re

    1. Initial program 55.6

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -2.3301205168757104 \cdot 10^{+153}:\\ \;\;\;\;-re\\ \mathbf{elif}\;re \le -3.728827270067989 \cdot 10^{-149}:\\ \;\;\;\;\sqrt{im \cdot im + re \cdot re}\\ \mathbf{elif}\;re \le 2.0900313658610145 \cdot 10^{-225}:\\ \;\;\;\;im\\ \mathbf{elif}\;re \le 1.1525123229926465 \cdot 10^{+142}:\\ \;\;\;\;\sqrt{im \cdot im + re \cdot re}\\ \mathbf{else}:\\ \;\;\;\;re\\ \end{array}\]

Reproduce

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