Average Error: 38.7 → 11.6
Time: 3.9s
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.07408121477840674 \cdot 10^{-17} \lor \neg \left(re \le 1.7538691601778439 \cdot 10^{51} \lor \neg \left(re \le 1.0065728139945699 \cdot 10^{120}\right)\right):\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\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 1.07408121477840674 \cdot 10^{-17} \lor \neg \left(re \le 1.7538691601778439 \cdot 10^{51} \lor \neg \left(re \le 1.0065728139945699 \cdot 10^{120}\right)\right):\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\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 r18758 = 0.5;
        double r18759 = 2.0;
        double r18760 = re;
        double r18761 = r18760 * r18760;
        double r18762 = im;
        double r18763 = r18762 * r18762;
        double r18764 = r18761 + r18763;
        double r18765 = sqrt(r18764);
        double r18766 = r18765 - r18760;
        double r18767 = r18759 * r18766;
        double r18768 = sqrt(r18767);
        double r18769 = r18758 * r18768;
        return r18769;
}

double f(double re, double im) {
        double r18770 = re;
        double r18771 = 1.0740812147784067e-17;
        bool r18772 = r18770 <= r18771;
        double r18773 = 1.753869160177844e+51;
        bool r18774 = r18770 <= r18773;
        double r18775 = 1.0065728139945699e+120;
        bool r18776 = r18770 <= r18775;
        double r18777 = !r18776;
        bool r18778 = r18774 || r18777;
        double r18779 = !r18778;
        bool r18780 = r18772 || r18779;
        double r18781 = 0.5;
        double r18782 = 2.0;
        double r18783 = im;
        double r18784 = hypot(r18770, r18783);
        double r18785 = r18784 - r18770;
        double r18786 = r18782 * r18785;
        double r18787 = sqrt(r18786);
        double r18788 = r18781 * r18787;
        double r18789 = 2.0;
        double r18790 = pow(r18783, r18789);
        double r18791 = 0.0;
        double r18792 = r18790 + r18791;
        double r18793 = r18770 + r18784;
        double r18794 = r18792 / r18793;
        double r18795 = r18782 * r18794;
        double r18796 = sqrt(r18795);
        double r18797 = r18781 * r18796;
        double r18798 = r18780 ? r18788 : r18797;
        return r18798;
}

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 < 1.0740812147784067e-17 or 1.753869160177844e+51 < re < 1.0065728139945699e+120

    1. Initial program 33.5

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

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

    if 1.0740812147784067e-17 < re < 1.753869160177844e+51 or 1.0065728139945699e+120 < re

    1. Initial program 57.9

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

      \[\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. Simplified42.3

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

      \[\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.6

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le 1.07408121477840674 \cdot 10^{-17} \lor \neg \left(re \le 1.7538691601778439 \cdot 10^{51} \lor \neg \left(re \le 1.0065728139945699 \cdot 10^{120}\right)\right):\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\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 2020060 +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)))))