Average Error: 39.2 → 11.7
Time: 3.5s
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 1.277594572889913386863098304318627392833 \cdot 10^{-80}:\\ \;\;\;\;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{\mathsf{fma}\left(im, im, 0\right)}{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 1.277594572889913386863098304318627392833 \cdot 10^{-80}:\\
\;\;\;\;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{\mathsf{fma}\left(im, im, 0\right)}{re + \mathsf{hypot}\left(re, im\right)}}\\

\end{array}
double f(double re, double im) {
        double r11636 = 0.5;
        double r11637 = 2.0;
        double r11638 = re;
        double r11639 = r11638 * r11638;
        double r11640 = im;
        double r11641 = r11640 * r11640;
        double r11642 = r11639 + r11641;
        double r11643 = sqrt(r11642);
        double r11644 = r11643 - r11638;
        double r11645 = r11637 * r11644;
        double r11646 = sqrt(r11645);
        double r11647 = r11636 * r11646;
        return r11647;
}

double f(double re, double im) {
        double r11648 = re;
        double r11649 = 1.2775945728899134e-80;
        bool r11650 = r11648 <= r11649;
        double r11651 = 0.5;
        double r11652 = 2.0;
        double r11653 = 1.0;
        double r11654 = im;
        double r11655 = hypot(r11648, r11654);
        double r11656 = r11653 * r11655;
        double r11657 = r11656 - r11648;
        double r11658 = r11652 * r11657;
        double r11659 = sqrt(r11658);
        double r11660 = r11651 * r11659;
        double r11661 = 0.0;
        double r11662 = fma(r11654, r11654, r11661);
        double r11663 = r11648 + r11655;
        double r11664 = r11662 / r11663;
        double r11665 = r11652 * r11664;
        double r11666 = sqrt(r11665);
        double r11667 = r11651 * r11666;
        double r11668 = r11650 ? r11660 : r11667;
        return r11668;
}

Error

Bits error versus re

Bits error versus im

Derivation

  1. Split input into 2 regimes
  2. if re < 1.2775945728899134e-80

    1. Initial program 32.0

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

      \[\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-prod32.0

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

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

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

    if 1.2775945728899134e-80 < re

    1. Initial program 54.8

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

      \[\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. Simplified38.9

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \frac{\color{blue}{\mathsf{fma}\left(im, im, 0\right)}}{\sqrt{re \cdot re + im \cdot im} + re}}\]
    5. Simplified30.6

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le 1.277594572889913386863098304318627392833 \cdot 10^{-80}:\\ \;\;\;\;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{\mathsf{fma}\left(im, im, 0\right)}{re + \mathsf{hypot}\left(re, im\right)}}\\ \end{array}\]

Reproduce

herbie shell --seed 2019344 +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)))))