Average Error: 38.9 → 11.9
Time: 2.8s
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 4.31409746536756331 \cdot 10^{89}:\\ \;\;\;\;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 4.31409746536756331 \cdot 10^{89}:\\
\;\;\;\;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 r10595 = 0.5;
        double r10596 = 2.0;
        double r10597 = re;
        double r10598 = r10597 * r10597;
        double r10599 = im;
        double r10600 = r10599 * r10599;
        double r10601 = r10598 + r10600;
        double r10602 = sqrt(r10601);
        double r10603 = r10602 - r10597;
        double r10604 = r10596 * r10603;
        double r10605 = sqrt(r10604);
        double r10606 = r10595 * r10605;
        return r10606;
}

double f(double re, double im) {
        double r10607 = re;
        double r10608 = 4.3140974653675633e+89;
        bool r10609 = r10607 <= r10608;
        double r10610 = 0.5;
        double r10611 = 2.0;
        double r10612 = 1.0;
        double r10613 = im;
        double r10614 = hypot(r10607, r10613);
        double r10615 = r10612 * r10614;
        double r10616 = r10615 - r10607;
        double r10617 = r10611 * r10616;
        double r10618 = sqrt(r10617);
        double r10619 = r10610 * r10618;
        double r10620 = 2.0;
        double r10621 = pow(r10613, r10620);
        double r10622 = 0.0;
        double r10623 = r10621 + r10622;
        double r10624 = r10607 + r10614;
        double r10625 = r10623 / r10624;
        double r10626 = r10611 * r10625;
        double r10627 = sqrt(r10626);
        double r10628 = r10610 * r10627;
        double r10629 = r10609 ? r10619 : r10628;
        return r10629;
}

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 < 4.3140974653675633e+89

    1. Initial program 34.2

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

      \[\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-prod34.2

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

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

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

    if 4.3140974653675633e+89 < re

    1. Initial program 60.7

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\]
    2. Using strategy rm
    3. Applied flip--60.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. Simplified45.8

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

      \[\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 4.31409746536756331 \cdot 10^{89}:\\ \;\;\;\;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 2020036 +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)))))