Average Error: 38.5 → 12.4
Time: 4.7s
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.0542686008392895 \cdot 10^{-44} \lor \neg \left(re \le 6.3965664142754167 \cdot 10^{-5} \lor \neg \left(re \le 1.0003561765365922 \cdot 10^{202}\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.0542686008392895 \cdot 10^{-44} \lor \neg \left(re \le 6.3965664142754167 \cdot 10^{-5} \lor \neg \left(re \le 1.0003561765365922 \cdot 10^{202}\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 r20933 = 0.5;
        double r20934 = 2.0;
        double r20935 = re;
        double r20936 = r20935 * r20935;
        double r20937 = im;
        double r20938 = r20937 * r20937;
        double r20939 = r20936 + r20938;
        double r20940 = sqrt(r20939);
        double r20941 = r20940 - r20935;
        double r20942 = r20934 * r20941;
        double r20943 = sqrt(r20942);
        double r20944 = r20933 * r20943;
        return r20944;
}

double f(double re, double im) {
        double r20945 = re;
        double r20946 = 1.0542686008392895e-44;
        bool r20947 = r20945 <= r20946;
        double r20948 = 6.396566414275417e-05;
        bool r20949 = r20945 <= r20948;
        double r20950 = 1.0003561765365922e+202;
        bool r20951 = r20945 <= r20950;
        double r20952 = !r20951;
        bool r20953 = r20949 || r20952;
        double r20954 = !r20953;
        bool r20955 = r20947 || r20954;
        double r20956 = 0.5;
        double r20957 = 2.0;
        double r20958 = im;
        double r20959 = hypot(r20945, r20958);
        double r20960 = r20959 - r20945;
        double r20961 = 0.0;
        double r20962 = r20960 + r20961;
        double r20963 = r20957 * r20962;
        double r20964 = sqrt(r20963);
        double r20965 = r20956 * r20964;
        double r20966 = 2.0;
        double r20967 = pow(r20958, r20966);
        double r20968 = r20967 + r20961;
        double r20969 = r20945 + r20959;
        double r20970 = r20968 / r20969;
        double r20971 = r20957 * r20970;
        double r20972 = sqrt(r20971);
        double r20973 = r20956 * r20972;
        double r20974 = r20955 ? r20965 : r20973;
        return r20974;
}

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.0542686008392895e-44 or 6.396566414275417e-05 < re < 1.0003561765365922e+202

    1. Initial program 35.9

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\]
    2. Using strategy rm
    3. Applied add-cube-cbrt36.5

      \[\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-sqrt36.5

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

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

      \[\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. Simplified11.1

      \[\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. Simplified10.1

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

    if 1.0542686008392895e-44 < re < 6.396566414275417e-05 or 1.0003561765365922e+202 < re

    1. Initial program 58.8

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

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

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le 1.0542686008392895 \cdot 10^{-44} \lor \neg \left(re \le 6.3965664142754167 \cdot 10^{-5} \lor \neg \left(re \le 1.0003561765365922 \cdot 10^{202}\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 2020100 +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)))))