Average Error: 38.7 → 13.7
Time: 22.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.726682013999257258829855908722105649883 \cdot 10^{170}:\\ \;\;\;\;0.5 \cdot \sqrt{e^{\log \left(\mathsf{hypot}\left(re, im\right) + re\right)} \cdot 2}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{\left(re + \sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}\right) \cdot 2}\\ \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.726682013999257258829855908722105649883 \cdot 10^{170}:\\
\;\;\;\;0.5 \cdot \sqrt{e^{\log \left(\mathsf{hypot}\left(re, im\right) + re\right)} \cdot 2}\\

\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{\left(re + \sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}\right) \cdot 2}\\

\end{array}
double f(double re, double im) {
        double r197460 = 0.5;
        double r197461 = 2.0;
        double r197462 = re;
        double r197463 = r197462 * r197462;
        double r197464 = im;
        double r197465 = r197464 * r197464;
        double r197466 = r197463 + r197465;
        double r197467 = sqrt(r197466);
        double r197468 = r197467 + r197462;
        double r197469 = r197461 * r197468;
        double r197470 = sqrt(r197469);
        double r197471 = r197460 * r197470;
        return r197471;
}

double f(double re, double im) {
        double r197472 = re;
        double r197473 = -1.7266820139992573e+170;
        bool r197474 = r197472 <= r197473;
        double r197475 = 0.5;
        double r197476 = im;
        double r197477 = hypot(r197472, r197476);
        double r197478 = r197477 + r197472;
        double r197479 = log(r197478);
        double r197480 = exp(r197479);
        double r197481 = 2.0;
        double r197482 = r197480 * r197481;
        double r197483 = sqrt(r197482);
        double r197484 = r197475 * r197483;
        double r197485 = sqrt(r197477);
        double r197486 = r197485 * r197485;
        double r197487 = r197472 + r197486;
        double r197488 = r197487 * r197481;
        double r197489 = sqrt(r197488);
        double r197490 = r197475 * r197489;
        double r197491 = r197474 ? r197484 : r197490;
        return r197491;
}

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.7
Target34.0
Herbie13.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 2 regimes
  2. if re < -1.7266820139992573e+170

    1. Initial program 64.0

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

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{\left(re + \mathsf{hypot}\left(re, im\right)\right) \cdot 2}}\]
    3. Using strategy rm
    4. Applied add-sqr-sqrt48.4

      \[\leadsto 0.5 \cdot \sqrt{\left(re + \color{blue}{\sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}}\right) \cdot 2}\]
    5. Using strategy rm
    6. Applied add-exp-log49.1

      \[\leadsto 0.5 \cdot \sqrt{\color{blue}{e^{\log \left(re + \sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}\right)}} \cdot 2}\]
    7. Simplified42.9

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

    if -1.7266820139992573e+170 < re

    1. Initial program 35.5

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

      \[\leadsto \color{blue}{0.5 \cdot \sqrt{\left(re + \mathsf{hypot}\left(re, im\right)\right) \cdot 2}}\]
    3. Using strategy rm
    4. Applied add-sqr-sqrt10.0

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

    \[\leadsto \begin{array}{l} \mathbf{if}\;re \le -1.726682013999257258829855908722105649883 \cdot 10^{170}:\\ \;\;\;\;0.5 \cdot \sqrt{e^{\log \left(\mathsf{hypot}\left(re, im\right) + re\right)} \cdot 2}\\ \mathbf{else}:\\ \;\;\;\;0.5 \cdot \sqrt{\left(re + \sqrt{\mathsf{hypot}\left(re, im\right)} \cdot \sqrt{\mathsf{hypot}\left(re, im\right)}\right) \cdot 2}\\ \end{array}\]

Reproduce

herbie shell --seed 2019304 +o rules:numerics
(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)))))