Average Error: 38.3 → 26.7
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 -8.5002325289073938542506059003071417869 \cdot 10^{-258}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2}}{\sqrt{re \cdot re + im \cdot im} - re}}\\ \mathbf{elif}\;re \le 3.614811860462173462455471699918830373615 \cdot 10^{-246}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im + re\right)}\\ \mathbf{elif}\;re \le 8.439330033545885045213726212950052594665 \cdot 10^{67}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(2 \cdot re\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 -8.5002325289073938542506059003071417869 \cdot 10^{-258}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2}}{\sqrt{re \cdot re + im \cdot im} - re}}\\

\mathbf{elif}\;re \le 3.614811860462173462455471699918830373615 \cdot 10^{-246}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im + re\right)}\\

\mathbf{elif}\;re \le 8.439330033545885045213726212950052594665 \cdot 10^{67}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\

\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(2 \cdot re\right)}\\

\end{array}
double f(double re, double im) {
        double r331487 = 0.5;
        double r331488 = 2.0;
        double r331489 = re;
        double r331490 = r331489 * r331489;
        double r331491 = im;
        double r331492 = r331491 * r331491;
        double r331493 = r331490 + r331492;
        double r331494 = sqrt(r331493);
        double r331495 = r331494 + r331489;
        double r331496 = r331488 * r331495;
        double r331497 = sqrt(r331496);
        double r331498 = r331487 * r331497;
        return r331498;
}

double f(double re, double im) {
        double r331499 = re;
        double r331500 = -8.500232528907394e-258;
        bool r331501 = r331499 <= r331500;
        double r331502 = 0.5;
        double r331503 = 2.0;
        double r331504 = im;
        double r331505 = 2.0;
        double r331506 = pow(r331504, r331505);
        double r331507 = r331499 * r331499;
        double r331508 = r331504 * r331504;
        double r331509 = r331507 + r331508;
        double r331510 = sqrt(r331509);
        double r331511 = r331510 - r331499;
        double r331512 = r331506 / r331511;
        double r331513 = r331503 * r331512;
        double r331514 = sqrt(r331513);
        double r331515 = r331502 * r331514;
        double r331516 = 3.6148118604621735e-246;
        bool r331517 = r331499 <= r331516;
        double r331518 = r331504 + r331499;
        double r331519 = r331503 * r331518;
        double r331520 = sqrt(r331519);
        double r331521 = r331502 * r331520;
        double r331522 = 8.439330033545885e+67;
        bool r331523 = r331499 <= r331522;
        double r331524 = r331510 + r331499;
        double r331525 = r331503 * r331524;
        double r331526 = sqrt(r331525);
        double r331527 = r331502 * r331526;
        double r331528 = r331505 * r331499;
        double r331529 = r331503 * r331528;
        double r331530 = sqrt(r331529);
        double r331531 = r331502 * r331530;
        double r331532 = r331523 ? r331527 : r331531;
        double r331533 = r331517 ? r331521 : r331532;
        double r331534 = r331501 ? r331515 : r331533;
        return r331534;
}

Error

Bits error versus re

Bits error versus im

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original38.3
Target33.4
Herbie26.7
\[\begin{array}{l} \mathbf{if}\;re \lt 0.0:\\ \;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \sqrt{\frac{im \cdot im}{\sqrt{re \cdot re + im \cdot im} - re}}\right)\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\ \end{array}\]

Derivation

  1. Split input into 4 regimes
  2. if re < -8.500232528907394e-258

    1. Initial program 46.6

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

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

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \frac{\color{blue}{{im}^{2}}}{\sqrt{re \cdot re + im \cdot im} - re}}\]

    if -8.500232528907394e-258 < re < 3.6148118604621735e-246

    1. Initial program 30.4

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

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{e^{\log \left(\sqrt{re \cdot re + im \cdot im}\right)}} + re\right)}\]
    4. Using strategy rm
    5. Applied pow1/232.5

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(e^{\log \color{blue}{\left({\left(re \cdot re + im \cdot im\right)}^{\frac{1}{2}}\right)}} + re\right)}\]
    6. Applied log-pow32.5

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(e^{\color{blue}{\frac{1}{2} \cdot \log \left(re \cdot re + im \cdot im\right)}} + re\right)}\]
    7. Applied exp-prod32.8

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{{\left(e^{\frac{1}{2}}\right)}^{\left(\log \left(re \cdot re + im \cdot im\right)\right)}} + re\right)}\]
    8. Taylor expanded around 0 32.3

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{im} + re\right)}\]

    if 3.6148118604621735e-246 < re < 8.439330033545885e+67

    1. Initial program 19.4

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\]

    if 8.439330033545885e+67 < re

    1. Initial program 46.7

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

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{e^{\log \left(\sqrt{re \cdot re + im \cdot im}\right)}} + re\right)}\]
    4. Using strategy rm
    5. Applied pow1/247.8

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(e^{\log \color{blue}{\left({\left(re \cdot re + im \cdot im\right)}^{\frac{1}{2}}\right)}} + re\right)}\]
    6. Applied log-pow47.8

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(e^{\color{blue}{\frac{1}{2} \cdot \log \left(re \cdot re + im \cdot im\right)}} + re\right)}\]
    7. Applied exp-prod47.9

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \left(\color{blue}{{\left(e^{\frac{1}{2}}\right)}^{\left(\log \left(re \cdot re + im \cdot im\right)\right)}} + re\right)}\]
    8. Taylor expanded around inf 12.0

      \[\leadsto 0.5 \cdot \sqrt{2 \cdot \color{blue}{\left(2 \cdot re\right)}}\]
  3. Recombined 4 regimes into one program.
  4. Final simplification26.7

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -8.5002325289073938542506059003071417869 \cdot 10^{-258}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{{im}^{2}}{\sqrt{re \cdot re + im \cdot im} - re}}\\ \mathbf{elif}\;re \le 3.614811860462173462455471699918830373615 \cdot 10^{-246}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(im + re\right)}\\ \mathbf{elif}\;re \le 8.439330033545885045213726212950052594665 \cdot 10^{67}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(2 \cdot re\right)}\\ \end{array}\]

Reproduce

herbie shell --seed 2020001 
(FPCore (re im)
  :name "math.sqrt on complex, real part"
  :precision binary64

  :herbie-target
  (if (< re 0.0) (* 0.5 (* (sqrt 2) (sqrt (/ (* im im) (- (sqrt (+ (* re re) (* im im))) re))))) (* 0.5 (sqrt (* 2 (+ (sqrt (+ (* re re) (* im im))) re)))))

  (* 0.5 (sqrt (* 2 (+ (sqrt (+ (* re re) (* im im))) re)))))