Average Error: 38.4 → 14.1
Time: 4.2s
Precision: 64
\[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} - re\right)}\]
\[\begin{array}{l} \mathbf{if}\;im \le 2.560862901069890731415987081111409855856 \cdot 10^{-149} \lor \neg \left(im \le 3.397001256475981463378846207534479575034 \cdot 10^{-102} \lor \neg \left(im \le 2.364199536335591838764361265118075567856 \cdot 10^{-26} \lor \neg \left(im \le 1.296068772043280593897223181133688304643 \cdot 10^{60}\right)\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}\;im \le 2.560862901069890731415987081111409855856 \cdot 10^{-149} \lor \neg \left(im \le 3.397001256475981463378846207534479575034 \cdot 10^{-102} \lor \neg \left(im \le 2.364199536335591838764361265118075567856 \cdot 10^{-26} \lor \neg \left(im \le 1.296068772043280593897223181133688304643 \cdot 10^{60}\right)\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 r22490 = 0.5;
        double r22491 = 2.0;
        double r22492 = re;
        double r22493 = r22492 * r22492;
        double r22494 = im;
        double r22495 = r22494 * r22494;
        double r22496 = r22493 + r22495;
        double r22497 = sqrt(r22496);
        double r22498 = r22497 - r22492;
        double r22499 = r22491 * r22498;
        double r22500 = sqrt(r22499);
        double r22501 = r22490 * r22500;
        return r22501;
}

double f(double re, double im) {
        double r22502 = im;
        double r22503 = 2.5608629010698907e-149;
        bool r22504 = r22502 <= r22503;
        double r22505 = 3.3970012564759815e-102;
        bool r22506 = r22502 <= r22505;
        double r22507 = 2.3641995363355918e-26;
        bool r22508 = r22502 <= r22507;
        double r22509 = 1.2960687720432806e+60;
        bool r22510 = r22502 <= r22509;
        double r22511 = !r22510;
        bool r22512 = r22508 || r22511;
        double r22513 = !r22512;
        bool r22514 = r22506 || r22513;
        double r22515 = !r22514;
        bool r22516 = r22504 || r22515;
        double r22517 = 0.5;
        double r22518 = 2.0;
        double r22519 = re;
        double r22520 = hypot(r22519, r22502);
        double r22521 = r22520 - r22519;
        double r22522 = 0.0;
        double r22523 = r22521 + r22522;
        double r22524 = r22518 * r22523;
        double r22525 = sqrt(r22524);
        double r22526 = r22517 * r22525;
        double r22527 = 2.0;
        double r22528 = pow(r22502, r22527);
        double r22529 = r22528 + r22522;
        double r22530 = r22519 + r22520;
        double r22531 = r22529 / r22530;
        double r22532 = r22518 * r22531;
        double r22533 = sqrt(r22532);
        double r22534 = r22517 * r22533;
        double r22535 = r22516 ? r22526 : r22534;
        return r22535;
}

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 im < 2.5608629010698907e-149 or 3.3970012564759815e-102 < im < 2.3641995363355918e-26 or 1.2960687720432806e+60 < im

    1. Initial program 40.2

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

      \[\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-sqrt40.8

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

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

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

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

    if 2.5608629010698907e-149 < im < 3.3970012564759815e-102 or 2.3641995363355918e-26 < im < 1.2960687720432806e+60

    1. Initial program 23.7

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

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

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \frac{\color{blue}{{im}^{2} + 0}}{\sqrt{re \cdot re + im \cdot im} + re}}\]
    5. Simplified21.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 simplification14.1

    \[\leadsto \begin{array}{l} \mathbf{if}\;im \le 2.560862901069890731415987081111409855856 \cdot 10^{-149} \lor \neg \left(im \le 3.397001256475981463378846207534479575034 \cdot 10^{-102} \lor \neg \left(im \le 2.364199536335591838764361265118075567856 \cdot 10^{-26} \lor \neg \left(im \le 1.296068772043280593897223181133688304643 \cdot 10^{60}\right)\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 2019346 +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)))))