Average Error: 39.4 → 26.6
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}\;\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \le 0.0:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\sqrt{re \cdot re + im \cdot im} - re}}\\ \mathbf{elif}\;\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \le 2.19256267331471872 \cdot 10^{76}:\\ \;\;\;\;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(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}\;\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \le 0.0:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\sqrt{re \cdot re + im \cdot im} - re}}\\

\mathbf{elif}\;\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \le 2.19256267331471872 \cdot 10^{76}:\\
\;\;\;\;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(re + im\right)}\\

\end{array}
double f(double re, double im) {
        double r230355 = 0.5;
        double r230356 = 2.0;
        double r230357 = re;
        double r230358 = r230357 * r230357;
        double r230359 = im;
        double r230360 = r230359 * r230359;
        double r230361 = r230358 + r230360;
        double r230362 = sqrt(r230361);
        double r230363 = r230362 + r230357;
        double r230364 = r230356 * r230363;
        double r230365 = sqrt(r230364);
        double r230366 = r230355 * r230365;
        return r230366;
}

double f(double re, double im) {
        double r230367 = 2.0;
        double r230368 = re;
        double r230369 = r230368 * r230368;
        double r230370 = im;
        double r230371 = r230370 * r230370;
        double r230372 = r230369 + r230371;
        double r230373 = sqrt(r230372);
        double r230374 = r230373 + r230368;
        double r230375 = r230367 * r230374;
        double r230376 = sqrt(r230375);
        double r230377 = 0.0;
        bool r230378 = r230376 <= r230377;
        double r230379 = 0.5;
        double r230380 = r230373 - r230368;
        double r230381 = r230371 / r230380;
        double r230382 = r230367 * r230381;
        double r230383 = sqrt(r230382);
        double r230384 = r230379 * r230383;
        double r230385 = 2.1925626733147187e+76;
        bool r230386 = r230376 <= r230385;
        double r230387 = r230379 * r230376;
        double r230388 = r230368 + r230370;
        double r230389 = r230367 * r230388;
        double r230390 = sqrt(r230389);
        double r230391 = r230379 * r230390;
        double r230392 = r230386 ? r230387 : r230391;
        double r230393 = r230378 ? r230384 : r230392;
        return r230393;
}

Error

Bits error versus re

Bits error versus im

Try it out

Your Program's Arguments

Results

Enter valid numbers for all inputs

Target

Original39.4
Target33.7
Herbie26.6
\[\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 3 regimes
  2. if (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re))) < 0.0

    1. Initial program 58.0

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

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

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

    if 0.0 < (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re))) < 2.1925626733147187e+76

    1. Initial program 4.4

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

    if 2.1925626733147187e+76 < (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))

    1. Initial program 63.6

      \[0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\]
    2. Taylor expanded around 0 44.6

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \le 0.0:\\ \;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\sqrt{re \cdot re + im \cdot im} - re}}\\ \mathbf{elif}\;\sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)} \le 2.19256267331471872 \cdot 10^{76}:\\ \;\;\;\;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(re + im\right)}\\ \end{array}\]

Reproduce

herbie shell --seed 2020020 
(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)))))