Average Error: 31.8 → 18.8
Time: 1.3s
Precision: 64
\[\sqrt{re \cdot re + im \cdot im}\]
\[\begin{array}{l} \mathbf{if}\;re \le -8789989068572990460:\\ \;\;\;\;-1 \cdot re\\ \mathbf{elif}\;re \le -4.2015690056388073 \cdot 10^{-231}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{elif}\;re \le 1.33367121357677706 \cdot 10^{-291}:\\ \;\;\;\;im\\ \mathbf{elif}\;re \le 8.0509896767148372 \cdot 10^{-74}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{elif}\;re \le 1.3202809311828264 \cdot 10^{-48}:\\ \;\;\;\;im\\ \mathbf{elif}\;re \le 3.9171532397504441 \cdot 10^{68}:\\ \;\;\;\;\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 -8789989068572990460:\\
\;\;\;\;-1 \cdot re\\

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

\mathbf{elif}\;re \le 1.33367121357677706 \cdot 10^{-291}:\\
\;\;\;\;im\\

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

\mathbf{elif}\;re \le 1.3202809311828264 \cdot 10^{-48}:\\
\;\;\;\;im\\

\mathbf{elif}\;re \le 3.9171532397504441 \cdot 10^{68}:\\
\;\;\;\;\sqrt{re \cdot re + im \cdot im}\\

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

\end{array}
double f(double re, double im) {
        double r39428 = re;
        double r39429 = r39428 * r39428;
        double r39430 = im;
        double r39431 = r39430 * r39430;
        double r39432 = r39429 + r39431;
        double r39433 = sqrt(r39432);
        return r39433;
}

double f(double re, double im) {
        double r39434 = re;
        double r39435 = -8.78998906857299e+18;
        bool r39436 = r39434 <= r39435;
        double r39437 = -1.0;
        double r39438 = r39437 * r39434;
        double r39439 = -4.2015690056388073e-231;
        bool r39440 = r39434 <= r39439;
        double r39441 = r39434 * r39434;
        double r39442 = im;
        double r39443 = r39442 * r39442;
        double r39444 = r39441 + r39443;
        double r39445 = sqrt(r39444);
        double r39446 = 1.333671213576777e-291;
        bool r39447 = r39434 <= r39446;
        double r39448 = 8.050989676714837e-74;
        bool r39449 = r39434 <= r39448;
        double r39450 = 1.3202809311828264e-48;
        bool r39451 = r39434 <= r39450;
        double r39452 = 3.917153239750444e+68;
        bool r39453 = r39434 <= r39452;
        double r39454 = r39453 ? r39445 : r39434;
        double r39455 = r39451 ? r39442 : r39454;
        double r39456 = r39449 ? r39445 : r39455;
        double r39457 = r39447 ? r39442 : r39456;
        double r39458 = r39440 ? r39445 : r39457;
        double r39459 = r39436 ? r39438 : r39458;
        return r39459;
}

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 < -8.78998906857299e+18

    1. Initial program 42.6

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

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

    if -8.78998906857299e+18 < re < -4.2015690056388073e-231 or 1.333671213576777e-291 < re < 8.050989676714837e-74 or 1.3202809311828264e-48 < re < 3.917153239750444e+68

    1. Initial program 20.2

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

    if -4.2015690056388073e-231 < re < 1.333671213576777e-291 or 8.050989676714837e-74 < re < 1.3202809311828264e-48

    1. Initial program 28.0

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

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

    if 3.917153239750444e+68 < re

    1. Initial program 48.1

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -8789989068572990460:\\ \;\;\;\;-1 \cdot re\\ \mathbf{elif}\;re \le -4.2015690056388073 \cdot 10^{-231}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{elif}\;re \le 1.33367121357677706 \cdot 10^{-291}:\\ \;\;\;\;im\\ \mathbf{elif}\;re \le 8.0509896767148372 \cdot 10^{-74}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{elif}\;re \le 1.3202809311828264 \cdot 10^{-48}:\\ \;\;\;\;im\\ \mathbf{elif}\;re \le 3.9171532397504441 \cdot 10^{68}:\\ \;\;\;\;\sqrt{re \cdot re + im \cdot im}\\ \mathbf{else}:\\ \;\;\;\;re\\ \end{array}\]

Reproduce

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