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;
}




Bits error versus re




Bits error versus im
Results
| Original | 39.4 |
|---|---|
| Target | 33.7 |
| Herbie | 26.6 |
if (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re))) < 0.0Initial program 58.0
rmApplied flip-+58.0
Simplified28.9
if 0.0 < (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re))) < 2.1925626733147187e+76Initial program 4.4
if 2.1925626733147187e+76 < (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re))) Initial program 63.6
Taylor expanded around 0 44.6
Final simplification26.6
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)))))