Average Error: 31.4 → 18.1
Time: 10.1s
Precision: 64
\[\sqrt{re \cdot re + im \cdot im}\]
\[\begin{array}{l} \mathbf{if}\;re \le -32252572021582464786156762700943678236520000:\\ \;\;\;\;-re\\ \mathbf{elif}\;re \le 1.949891623707017456131986292760721140859 \cdot 10^{80}:\\ \;\;\;\;\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 -32252572021582464786156762700943678236520000:\\
\;\;\;\;-re\\

\mathbf{elif}\;re \le 1.949891623707017456131986292760721140859 \cdot 10^{80}:\\
\;\;\;\;\sqrt{re \cdot re + im \cdot im}\\

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

\end{array}
double f(double re, double im) {
        double r56763 = re;
        double r56764 = r56763 * r56763;
        double r56765 = im;
        double r56766 = r56765 * r56765;
        double r56767 = r56764 + r56766;
        double r56768 = sqrt(r56767);
        return r56768;
}

double f(double re, double im) {
        double r56769 = re;
        double r56770 = -3.2252572021582465e+43;
        bool r56771 = r56769 <= r56770;
        double r56772 = -r56769;
        double r56773 = 1.9498916237070175e+80;
        bool r56774 = r56769 <= r56773;
        double r56775 = r56769 * r56769;
        double r56776 = im;
        double r56777 = r56776 * r56776;
        double r56778 = r56775 + r56777;
        double r56779 = sqrt(r56778);
        double r56780 = r56774 ? r56779 : r56769;
        double r56781 = r56771 ? r56772 : r56780;
        return r56781;
}

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 < -3.2252572021582465e+43

    1. Initial program 43.5

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

      \[\leadsto \color{blue}{-1 \cdot re}\]
    3. Simplified12.8

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

    if -3.2252572021582465e+43 < re < 1.9498916237070175e+80

    1. Initial program 22.3

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

    if 1.9498916237070175e+80 < re

    1. Initial program 48.6

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -32252572021582464786156762700943678236520000:\\ \;\;\;\;-re\\ \mathbf{elif}\;re \le 1.949891623707017456131986292760721140859 \cdot 10^{80}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{else}:\\ \;\;\;\;re\\ \end{array}\]

Reproduce

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