Average Error: 39.0 → 11.9
Time: 4.1s
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 3.3204403376095907 \cdot 10^{174}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(1 \cdot \mathsf{hypot}\left(re, im\right) - re\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2} + 0}{re + \mathsf{hypot}\left(re, im\right)}}\\ \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 3.3204403376095907 \cdot 10^{174}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(1 \cdot \mathsf{hypot}\left(re, im\right) - re\right)}\\

\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2} + 0}{re + \mathsf{hypot}\left(re, im\right)}}\\

\end{array}
double f(double re, double im) {
        double r16963 = 0.5;
        double r16964 = 2.0;
        double r16965 = re;
        double r16966 = r16965 * r16965;
        double r16967 = im;
        double r16968 = r16967 * r16967;
        double r16969 = r16966 + r16968;
        double r16970 = sqrt(r16969);
        double r16971 = r16970 - r16965;
        double r16972 = r16964 * r16971;
        double r16973 = sqrt(r16972);
        double r16974 = r16963 * r16973;
        return r16974;
}

double f(double re, double im) {
        double r16975 = re;
        double r16976 = 3.3204403376095907e+174;
        bool r16977 = r16975 <= r16976;
        double r16978 = 0.5;
        double r16979 = 2.0;
        double r16980 = 1.0;
        double r16981 = im;
        double r16982 = hypot(r16975, r16981);
        double r16983 = r16980 * r16982;
        double r16984 = r16983 - r16975;
        double r16985 = r16979 * r16984;
        double r16986 = sqrt(r16985);
        double r16987 = r16978 * r16986;
        double r16988 = 2.0;
        double r16989 = pow(r16981, r16988);
        double r16990 = 0.0;
        double r16991 = r16989 + r16990;
        double r16992 = r16975 + r16982;
        double r16993 = r16991 / r16992;
        double r16994 = r16979 * r16993;
        double r16995 = sqrt(r16994);
        double r16996 = r16978 * r16995;
        double r16997 = r16977 ? r16987 : r16996;
        return r16997;
}

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 2 regimes
  2. if re < 3.3204403376095907e+174

    1. Initial program 36.1

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\]
    2. Using strategy rm
    3. Applied *-un-lft-identity36.1

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

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

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

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

    if 3.3204403376095907e+174 < re

    1. Initial program 64.0

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

      \[\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. Simplified50.4

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \frac{\color{blue}{{im}^{2} + 0}}{\sqrt{re \cdot re + im \cdot im} + re}}\]
    5. Simplified31.1

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2} + 0}{\color{blue}{re + \mathsf{hypot}\left(re, im\right)}}}\]
  3. Recombined 2 regimes into one program.
  4. Final simplification11.9

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le 3.3204403376095907 \cdot 10^{174}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(1 \cdot \mathsf{hypot}\left(re, im\right) - re\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2} + 0}{re + \mathsf{hypot}\left(re, im\right)}}\\ \end{array}\]

Reproduce

herbie shell --seed 2020089 +o rules:numerics
(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)))))