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(\left(\mathsf{hypot}\left(re, im\right) - re\right) + 0\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(\left(\mathsf{hypot}\left(re, im\right) - re\right) + 0\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 r18720 = 0.5;
        double r18721 = 2.0;
        double r18722 = re;
        double r18723 = r18722 * r18722;
        double r18724 = im;
        double r18725 = r18724 * r18724;
        double r18726 = r18723 + r18725;
        double r18727 = sqrt(r18726);
        double r18728 = r18727 - r18722;
        double r18729 = r18721 * r18728;
        double r18730 = sqrt(r18729);
        double r18731 = r18720 * r18730;
        return r18731;
}

double f(double re, double im) {
        double r18732 = re;
        double r18733 = 1.0740812147784067e-17;
        bool r18734 = r18732 <= r18733;
        double r18735 = 1.753869160177844e+51;
        bool r18736 = r18732 <= r18735;
        double r18737 = 1.0065728139945699e+120;
        bool r18738 = r18732 <= r18737;
        double r18739 = !r18738;
        bool r18740 = r18736 || r18739;
        double r18741 = !r18740;
        bool r18742 = r18734 || r18741;
        double r18743 = 0.5;
        double r18744 = 2.0;
        double r18745 = im;
        double r18746 = hypot(r18732, r18745);
        double r18747 = r18746 - r18732;
        double r18748 = 0.0;
        double r18749 = r18747 + r18748;
        double r18750 = r18744 * r18749;
        double r18751 = sqrt(r18750);
        double r18752 = r18743 * r18751;
        double r18753 = 2.0;
        double r18754 = pow(r18745, r18753);
        double r18755 = r18754 + r18748;
        double r18756 = r18732 + r18746;
        double r18757 = r18755 / r18756;
        double r18758 = r18744 * r18757;
        double r18759 = sqrt(r18758);
        double r18760 = r18743 * r18759;
        double r18761 = r18742 ? r18752 : r18760;
        return r18761;
}

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 add-cube-cbrt33.9

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - \color{blue}{\left(\sqrt[3]{re} \cdot \sqrt[3]{re}\right) \cdot \sqrt[3]{re}}\right)}\]
    4. Applied add-sqr-sqrt33.9

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

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{\sqrt{\sqrt{re \cdot re + im \cdot im}} \cdot \sqrt{\sqrt{re \cdot re + im \cdot im}}} - \left(\sqrt[3]{re} \cdot \sqrt[3]{re}\right) \cdot \sqrt[3]{re}\right)}\]
    6. Applied prod-diff34.0

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(\mathsf{fma}\left(\sqrt{\sqrt{re \cdot re + im \cdot im}}, \sqrt{\sqrt{re \cdot re + im \cdot im}}, -\sqrt[3]{re} \cdot \left(\sqrt[3]{re} \cdot \sqrt[3]{re}\right)\right) + \mathsf{fma}\left(-\sqrt[3]{re}, \sqrt[3]{re} \cdot \sqrt[3]{re}, \sqrt[3]{re} \cdot \left(\sqrt[3]{re} \cdot \sqrt[3]{re}\right)\right)\right)}}\]
    7. Simplified7.0

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{\left(\mathsf{hypot}\left(re, im\right) - re\right)} + \mathsf{fma}\left(-\sqrt[3]{re}, \sqrt[3]{re} \cdot \sqrt[3]{re}, \sqrt[3]{re} \cdot \left(\sqrt[3]{re} \cdot \sqrt[3]{re}\right)\right)\right)}\]
    8. Simplified6.6

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\left(\mathsf{hypot}\left(re, im\right) - re\right) + \color{blue}{0}\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(\left(\mathsf{hypot}\left(re, im\right) - re\right) + 0\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)))))