Average Error: 37.3 → 22.9
Time: 27.5s
Precision: 64
\[0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\]
\[\begin{array}{l} \mathbf{if}\;im \le -5.77763001913738 \cdot 10^{+77}:\\ \;\;\;\;0.5 \cdot \sqrt{\left(-\left(re + im\right)\right) \cdot 2.0}\\ \mathbf{elif}\;im \le -5.064661185225939 \cdot 10^{-112}:\\ \;\;\;\;\frac{\sqrt{2.0 \cdot \left(im \cdot im\right)}}{\sqrt{\sqrt{im \cdot im + re \cdot re} + re}} \cdot 0.5\\ \mathbf{elif}\;im \le 3.878550394816133 \cdot 10^{-144}:\\ \;\;\;\;\sqrt{2.0 \cdot \left(re \cdot -2\right)} \cdot 0.5\\ \mathbf{elif}\;im \le 2.6002124496209947 \cdot 10^{+64}:\\ \;\;\;\;\frac{\sqrt{2.0 \cdot \left(im \cdot im\right)}}{\sqrt{\sqrt{im \cdot im + re \cdot re} + re}} \cdot 0.5\\ \mathbf{else}:\\ \;\;\;\;\sqrt{\left(im - re\right) \cdot 2.0} \cdot 0.5\\ \end{array}\]
double f(double re, double im) {
        double r1287058 = 0.5;
        double r1287059 = 2.0;
        double r1287060 = re;
        double r1287061 = r1287060 * r1287060;
        double r1287062 = im;
        double r1287063 = r1287062 * r1287062;
        double r1287064 = r1287061 + r1287063;
        double r1287065 = sqrt(r1287064);
        double r1287066 = r1287065 - r1287060;
        double r1287067 = r1287059 * r1287066;
        double r1287068 = sqrt(r1287067);
        double r1287069 = r1287058 * r1287068;
        return r1287069;
}

double f(double re, double im) {
        double r1287070 = im;
        double r1287071 = -5.77763001913738e+77;
        bool r1287072 = r1287070 <= r1287071;
        double r1287073 = 0.5;
        double r1287074 = re;
        double r1287075 = r1287074 + r1287070;
        double r1287076 = -r1287075;
        double r1287077 = 2.0;
        double r1287078 = r1287076 * r1287077;
        double r1287079 = sqrt(r1287078);
        double r1287080 = r1287073 * r1287079;
        double r1287081 = -5.064661185225939e-112;
        bool r1287082 = r1287070 <= r1287081;
        double r1287083 = r1287070 * r1287070;
        double r1287084 = r1287077 * r1287083;
        double r1287085 = sqrt(r1287084);
        double r1287086 = r1287074 * r1287074;
        double r1287087 = r1287083 + r1287086;
        double r1287088 = sqrt(r1287087);
        double r1287089 = r1287088 + r1287074;
        double r1287090 = sqrt(r1287089);
        double r1287091 = r1287085 / r1287090;
        double r1287092 = r1287091 * r1287073;
        double r1287093 = 3.878550394816133e-144;
        bool r1287094 = r1287070 <= r1287093;
        double r1287095 = -2.0;
        double r1287096 = r1287074 * r1287095;
        double r1287097 = r1287077 * r1287096;
        double r1287098 = sqrt(r1287097);
        double r1287099 = r1287098 * r1287073;
        double r1287100 = 2.6002124496209947e+64;
        bool r1287101 = r1287070 <= r1287100;
        double r1287102 = r1287070 - r1287074;
        double r1287103 = r1287102 * r1287077;
        double r1287104 = sqrt(r1287103);
        double r1287105 = r1287104 * r1287073;
        double r1287106 = r1287101 ? r1287092 : r1287105;
        double r1287107 = r1287094 ? r1287099 : r1287106;
        double r1287108 = r1287082 ? r1287092 : r1287107;
        double r1287109 = r1287072 ? r1287080 : r1287108;
        return r1287109;
}

0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}
\begin{array}{l}
\mathbf{if}\;im \le -5.77763001913738 \cdot 10^{+77}:\\
\;\;\;\;0.5 \cdot \sqrt{\left(-\left(re + im\right)\right) \cdot 2.0}\\

\mathbf{elif}\;im \le -5.064661185225939 \cdot 10^{-112}:\\
\;\;\;\;\frac{\sqrt{2.0 \cdot \left(im \cdot im\right)}}{\sqrt{\sqrt{im \cdot im + re \cdot re} + re}} \cdot 0.5\\

\mathbf{elif}\;im \le 3.878550394816133 \cdot 10^{-144}:\\
\;\;\;\;\sqrt{2.0 \cdot \left(re \cdot -2\right)} \cdot 0.5\\

\mathbf{elif}\;im \le 2.6002124496209947 \cdot 10^{+64}:\\
\;\;\;\;\frac{\sqrt{2.0 \cdot \left(im \cdot im\right)}}{\sqrt{\sqrt{im \cdot im + re \cdot re} + re}} \cdot 0.5\\

\mathbf{else}:\\
\;\;\;\;\sqrt{\left(im - re\right) \cdot 2.0} \cdot 0.5\\

\end{array}

Error

Bits error versus re

Bits error versus im

Derivation

  1. Split input into 4 regimes
  2. if im < -5.77763001913738e+77

    1. Initial program 46.8

      \[0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\]
    2. Using strategy rm
    3. Applied +-commutative46.8

      \[\leadsto 0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{\color{blue}{im \cdot im + re \cdot re}} - re\right)}\]
    4. Taylor expanded around -inf 10.3

      \[\leadsto 0.5 \cdot \sqrt{2.0 \cdot \color{blue}{\left(-\left(re + im\right)\right)}}\]

    if -5.77763001913738e+77 < im < -5.064661185225939e-112 or 3.878550394816133e-144 < im < 2.6002124496209947e+64

    1. Initial program 24.1

      \[0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\]
    2. Using strategy rm
    3. Applied flip--33.6

      \[\leadsto 0.5 \cdot \sqrt{2.0 \cdot \color{blue}{\frac{\sqrt{re \cdot re + im \cdot im} \cdot \sqrt{re \cdot re + im \cdot im} - re \cdot re}{\sqrt{re \cdot re + im \cdot im} + re}}}\]
    4. Applied associate-*r/33.6

      \[\leadsto 0.5 \cdot \sqrt{\color{blue}{\frac{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} \cdot \sqrt{re \cdot re + im \cdot im} - re \cdot re\right)}{\sqrt{re \cdot re + im \cdot im} + re}}}\]
    5. Applied sqrt-div33.7

      \[\leadsto 0.5 \cdot \color{blue}{\frac{\sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} \cdot \sqrt{re \cdot re + im \cdot im} - re \cdot re\right)}}{\sqrt{\sqrt{re \cdot re + im \cdot im} + re}}}\]
    6. Simplified25.5

      \[\leadsto 0.5 \cdot \frac{\color{blue}{\sqrt{2.0 \cdot \left(im \cdot im\right)}}}{\sqrt{\sqrt{re \cdot re + im \cdot im} + re}}\]

    if -5.064661185225939e-112 < im < 3.878550394816133e-144

    1. Initial program 39.9

      \[0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\]
    2. Taylor expanded around -inf 35.7

      \[\leadsto 0.5 \cdot \sqrt{2.0 \cdot \color{blue}{\left(-2 \cdot re\right)}}\]

    if 2.6002124496209947e+64 < im

    1. Initial program 46.0

      \[0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\]
    2. Using strategy rm
    3. Applied +-commutative46.0

      \[\leadsto 0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{\color{blue}{im \cdot im + re \cdot re}} - re\right)}\]
    4. Taylor expanded around inf 11.0

      \[\leadsto 0.5 \cdot \sqrt{2.0 \cdot \color{blue}{\left(im - re\right)}}\]
  3. Recombined 4 regimes into one program.
  4. Final simplification22.9

    \[\leadsto \begin{array}{l} \mathbf{if}\;im \le -5.77763001913738 \cdot 10^{+77}:\\ \;\;\;\;0.5 \cdot \sqrt{\left(-\left(re + im\right)\right) \cdot 2.0}\\ \mathbf{elif}\;im \le -5.064661185225939 \cdot 10^{-112}:\\ \;\;\;\;\frac{\sqrt{2.0 \cdot \left(im \cdot im\right)}}{\sqrt{\sqrt{im \cdot im + re \cdot re} + re}} \cdot 0.5\\ \mathbf{elif}\;im \le 3.878550394816133 \cdot 10^{-144}:\\ \;\;\;\;\sqrt{2.0 \cdot \left(re \cdot -2\right)} \cdot 0.5\\ \mathbf{elif}\;im \le 2.6002124496209947 \cdot 10^{+64}:\\ \;\;\;\;\frac{\sqrt{2.0 \cdot \left(im \cdot im\right)}}{\sqrt{\sqrt{im \cdot im + re \cdot re} + re}} \cdot 0.5\\ \mathbf{else}:\\ \;\;\;\;\sqrt{\left(im - re\right) \cdot 2.0} \cdot 0.5\\ \end{array}\]

Reproduce

herbie shell --seed 2019102 
(FPCore (re im)
  :name "math.sqrt on complex, imaginary part, im greater than 0 branch"
  (* 0.5 (sqrt (* 2.0 (- (sqrt (+ (* re re) (* im im))) re)))))