Average Error: 31.7 → 18.6
Time: 2.2s
Precision: 64
\[\sqrt{re \cdot re + im \cdot im}\]
\[\begin{array}{l} \mathbf{if}\;re \le -1.3090719358562694 \cdot 10^{108}:\\ \;\;\;\;-re\\ \mathbf{elif}\;re \le -1.70245825704136342 \cdot 10^{-245}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{elif}\;re \le 3.3295675416621997 \cdot 10^{-138}:\\ \;\;\;\;im\\ \mathbf{elif}\;re \le 5.6732898487300134 \cdot 10^{92}:\\ \;\;\;\;\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.3090719358562694 \cdot 10^{108}:\\
\;\;\;\;-re\\

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

\mathbf{elif}\;re \le 3.3295675416621997 \cdot 10^{-138}:\\
\;\;\;\;im\\

\mathbf{elif}\;re \le 5.6732898487300134 \cdot 10^{92}:\\
\;\;\;\;\sqrt{re \cdot re + im \cdot im}\\

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

\end{array}
double f(double re, double im) {
        double r36946 = re;
        double r36947 = r36946 * r36946;
        double r36948 = im;
        double r36949 = r36948 * r36948;
        double r36950 = r36947 + r36949;
        double r36951 = sqrt(r36950);
        return r36951;
}

double f(double re, double im) {
        double r36952 = re;
        double r36953 = -1.3090719358562694e+108;
        bool r36954 = r36952 <= r36953;
        double r36955 = -r36952;
        double r36956 = -1.7024582570413634e-245;
        bool r36957 = r36952 <= r36956;
        double r36958 = r36952 * r36952;
        double r36959 = im;
        double r36960 = r36959 * r36959;
        double r36961 = r36958 + r36960;
        double r36962 = sqrt(r36961);
        double r36963 = 3.3295675416622e-138;
        bool r36964 = r36952 <= r36963;
        double r36965 = 5.673289848730013e+92;
        bool r36966 = r36952 <= r36965;
        double r36967 = r36966 ? r36962 : r36952;
        double r36968 = r36964 ? r36959 : r36967;
        double r36969 = r36957 ? r36962 : r36968;
        double r36970 = r36954 ? r36955 : r36969;
        return r36970;
}

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 < -1.3090719358562694e+108

    1. Initial program 52.7

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

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

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

    if -1.3090719358562694e+108 < re < -1.7024582570413634e-245 or 3.3295675416622e-138 < re < 5.673289848730013e+92

    1. Initial program 18.2

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

    if -1.7024582570413634e-245 < re < 3.3295675416622e-138

    1. Initial program 29.8

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

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

    if 5.673289848730013e+92 < re

    1. Initial program 49.9

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -1.3090719358562694 \cdot 10^{108}:\\ \;\;\;\;-re\\ \mathbf{elif}\;re \le -1.70245825704136342 \cdot 10^{-245}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{elif}\;re \le 3.3295675416621997 \cdot 10^{-138}:\\ \;\;\;\;im\\ \mathbf{elif}\;re \le 5.6732898487300134 \cdot 10^{92}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{else}:\\ \;\;\;\;re\\ \end{array}\]

Reproduce

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