Average Error: 38.9 → 27.7
Time: 4.2s
Precision: 64
\[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\]
\[\begin{array}{l} \mathbf{if}\;re \le -6.8846914672875272 \cdot 10^{72}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(-2 \cdot re\right)}\\ \mathbf{elif}\;re \le -6.10111052612686754 \cdot 10^{-93}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{\sqrt{re \cdot re + im \cdot im}} \cdot \sqrt{\sqrt{re \cdot re + im \cdot im}} - re\right)}\\ \mathbf{elif}\;re \le -3.3124292600034948 \cdot 10^{-125}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im - re\right)}\\ \mathbf{elif}\;re \le -7.54474836196326423 \cdot 10^{-281}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{\sqrt{re \cdot re + im \cdot im}} \cdot \sqrt{\sqrt{re \cdot re + im \cdot im}} - re\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\sqrt{re \cdot re + im \cdot im} + re}}\\ \end{array}\]
0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}
\begin{array}{l}
\mathbf{if}\;re \le -6.8846914672875272 \cdot 10^{72}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(-2 \cdot re\right)}\\

\mathbf{elif}\;re \le -6.10111052612686754 \cdot 10^{-93}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{\sqrt{re \cdot re + im \cdot im}} \cdot \sqrt{\sqrt{re \cdot re + im \cdot im}} - re\right)}\\

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

\mathbf{elif}\;re \le -7.54474836196326423 \cdot 10^{-281}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{\sqrt{re \cdot re + im \cdot im}} \cdot \sqrt{\sqrt{re \cdot re + im \cdot im}} - re\right)}\\

\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\sqrt{re \cdot re + im \cdot im} + re}}\\

\end{array}
double f(double re, double im) {
        double r15164 = 0.5;
        double r15165 = 2.0;
        double r15166 = re;
        double r15167 = r15166 * r15166;
        double r15168 = im;
        double r15169 = r15168 * r15168;
        double r15170 = r15167 + r15169;
        double r15171 = sqrt(r15170);
        double r15172 = r15171 - r15166;
        double r15173 = r15165 * r15172;
        double r15174 = sqrt(r15173);
        double r15175 = r15164 * r15174;
        return r15175;
}

double f(double re, double im) {
        double r15176 = re;
        double r15177 = -6.884691467287527e+72;
        bool r15178 = r15176 <= r15177;
        double r15179 = 0.5;
        double r15180 = 2.0;
        double r15181 = -2.0;
        double r15182 = r15181 * r15176;
        double r15183 = r15180 * r15182;
        double r15184 = sqrt(r15183);
        double r15185 = r15179 * r15184;
        double r15186 = -6.1011105261268675e-93;
        bool r15187 = r15176 <= r15186;
        double r15188 = r15176 * r15176;
        double r15189 = im;
        double r15190 = r15189 * r15189;
        double r15191 = r15188 + r15190;
        double r15192 = sqrt(r15191);
        double r15193 = sqrt(r15192);
        double r15194 = r15193 * r15193;
        double r15195 = r15194 - r15176;
        double r15196 = r15180 * r15195;
        double r15197 = sqrt(r15196);
        double r15198 = r15179 * r15197;
        double r15199 = -3.312429260003495e-125;
        bool r15200 = r15176 <= r15199;
        double r15201 = r15189 - r15176;
        double r15202 = r15180 * r15201;
        double r15203 = sqrt(r15202);
        double r15204 = r15179 * r15203;
        double r15205 = -7.544748361963264e-281;
        bool r15206 = r15176 <= r15205;
        double r15207 = r15192 + r15176;
        double r15208 = r15190 / r15207;
        double r15209 = r15180 * r15208;
        double r15210 = sqrt(r15209);
        double r15211 = r15179 * r15210;
        double r15212 = r15206 ? r15198 : r15211;
        double r15213 = r15200 ? r15204 : r15212;
        double r15214 = r15187 ? r15198 : r15213;
        double r15215 = r15178 ? r15185 : r15214;
        return r15215;
}

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 < -6.884691467287527e+72

    1. Initial program 47.3

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

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

    if -6.884691467287527e+72 < re < -6.1011105261268675e-93 or -3.312429260003495e-125 < re < -7.544748361963264e-281

    1. Initial program 20.9

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\]
    2. Using strategy rm
    3. Applied add-sqr-sqrt20.9

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\sqrt{\color{blue}{\sqrt{re \cdot re + im \cdot im} \cdot \sqrt{re \cdot re + im \cdot im}}} - re\right)}\]
    4. Applied sqrt-prod21.0

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

    if -6.1011105261268675e-93 < re < -3.312429260003495e-125

    1. Initial program 17.7

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

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

    if -7.544748361963264e-281 < re

    1. Initial program 45.8

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

      \[\leadsto 0.5 \cdot \sqrt{2 \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. Simplified36.0

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \frac{\color{blue}{im \cdot im}}{\sqrt{re \cdot re + im \cdot im} + re}}\]
  3. Recombined 4 regimes into one program.
  4. Final simplification27.7

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -6.8846914672875272 \cdot 10^{72}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(-2 \cdot re\right)}\\ \mathbf{elif}\;re \le -6.10111052612686754 \cdot 10^{-93}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{\sqrt{re \cdot re + im \cdot im}} \cdot \sqrt{\sqrt{re \cdot re + im \cdot im}} - re\right)}\\ \mathbf{elif}\;re \le -3.3124292600034948 \cdot 10^{-125}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im - re\right)}\\ \mathbf{elif}\;re \le -7.54474836196326423 \cdot 10^{-281}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{\sqrt{re \cdot re + im \cdot im}} \cdot \sqrt{\sqrt{re \cdot re + im \cdot im}} - re\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\sqrt{re \cdot re + im \cdot im} + re}}\\ \end{array}\]

Reproduce

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