Average Error: 38.6 → 31.5
Time: 21.8s
Precision: 64
\[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\]
\[\begin{array}{l} \mathbf{if}\;im \le -4.401660052897909132614101168939860146664 \cdot 10^{-161}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{\left(\sqrt[3]{re \cdot re + im \cdot im} \cdot \sqrt[3]{re \cdot re + im \cdot im}\right) \cdot \sqrt[3]{re \cdot re + im \cdot im}} - re\right)}\\ \mathbf{elif}\;im \le -2.172887328838732504262895232782467753864 \cdot 10^{-298}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(-2 \cdot re\right)}\\ \mathbf{elif}\;im \le 5.136932717067223462435017556148010291487 \cdot 10^{-273}:\\ \;\;\;\;0\\ \mathbf{elif}\;im \le 3.983764504348168358043013809472625949076 \cdot 10^{-85}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(-2 \cdot re\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im - re\right)}\\ \end{array}\]
0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}
\begin{array}{l}
\mathbf{if}\;im \le -4.401660052897909132614101168939860146664 \cdot 10^{-161}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{\left(\sqrt[3]{re \cdot re + im \cdot im} \cdot \sqrt[3]{re \cdot re + im \cdot im}\right) \cdot \sqrt[3]{re \cdot re + im \cdot im}} - re\right)}\\

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

\mathbf{elif}\;im \le 5.136932717067223462435017556148010291487 \cdot 10^{-273}:\\
\;\;\;\;0\\

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

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

\end{array}
double f(double re, double im) {
        double r22867 = 0.5;
        double r22868 = 2.0;
        double r22869 = re;
        double r22870 = r22869 * r22869;
        double r22871 = im;
        double r22872 = r22871 * r22871;
        double r22873 = r22870 + r22872;
        double r22874 = sqrt(r22873);
        double r22875 = r22874 - r22869;
        double r22876 = r22868 * r22875;
        double r22877 = sqrt(r22876);
        double r22878 = r22867 * r22877;
        return r22878;
}

double f(double re, double im) {
        double r22879 = im;
        double r22880 = -4.401660052897909e-161;
        bool r22881 = r22879 <= r22880;
        double r22882 = 0.5;
        double r22883 = 2.0;
        double r22884 = re;
        double r22885 = r22884 * r22884;
        double r22886 = r22879 * r22879;
        double r22887 = r22885 + r22886;
        double r22888 = cbrt(r22887);
        double r22889 = r22888 * r22888;
        double r22890 = r22889 * r22888;
        double r22891 = sqrt(r22890);
        double r22892 = r22891 - r22884;
        double r22893 = r22883 * r22892;
        double r22894 = sqrt(r22893);
        double r22895 = r22882 * r22894;
        double r22896 = -2.1728873288387325e-298;
        bool r22897 = r22879 <= r22896;
        double r22898 = -2.0;
        double r22899 = r22898 * r22884;
        double r22900 = r22883 * r22899;
        double r22901 = sqrt(r22900);
        double r22902 = r22882 * r22901;
        double r22903 = 5.1369327170672235e-273;
        bool r22904 = r22879 <= r22903;
        double r22905 = 0.0;
        double r22906 = 3.9837645043481684e-85;
        bool r22907 = r22879 <= r22906;
        double r22908 = r22879 - r22884;
        double r22909 = r22883 * r22908;
        double r22910 = sqrt(r22909);
        double r22911 = r22882 * r22910;
        double r22912 = r22907 ? r22902 : r22911;
        double r22913 = r22904 ? r22905 : r22912;
        double r22914 = r22897 ? r22902 : r22913;
        double r22915 = r22881 ? r22895 : r22914;
        return r22915;
}

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 im < -4.401660052897909e-161

    1. Initial program 37.1

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

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

    if -4.401660052897909e-161 < im < -2.1728873288387325e-298 or 5.1369327170672235e-273 < im < 3.9837645043481684e-85

    1. Initial program 40.7

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

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

    if -2.1728873288387325e-298 < im < 5.1369327170672235e-273

    1. Initial program 40.7

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

      \[\leadsto 0.5 \cdot \color{blue}{0}\]

    if 3.9837645043481684e-85 < im

    1. Initial program 38.3

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;im \le -4.401660052897909132614101168939860146664 \cdot 10^{-161}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{\left(\sqrt[3]{re \cdot re + im \cdot im} \cdot \sqrt[3]{re \cdot re + im \cdot im}\right) \cdot \sqrt[3]{re \cdot re + im \cdot im}} - re\right)}\\ \mathbf{elif}\;im \le -2.172887328838732504262895232782467753864 \cdot 10^{-298}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(-2 \cdot re\right)}\\ \mathbf{elif}\;im \le 5.136932717067223462435017556148010291487 \cdot 10^{-273}:\\ \;\;\;\;0\\ \mathbf{elif}\;im \le 3.983764504348168358043013809472625949076 \cdot 10^{-85}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(-2 \cdot re\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im - re\right)}\\ \end{array}\]

Reproduce

herbie shell --seed 2019323 
(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)))))