0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -1.25223341265023233009076369086492232149 \cdot 10^{106}:\\
\;\;\;\;\frac{\sqrt{\left(im \cdot im\right) \cdot 2}}{\sqrt{-2 \cdot re}} \cdot 0.5\\
\mathbf{elif}\;re \le 2.8714878455354807468314928641279810052 \cdot 10^{-309}:\\
\;\;\;\;\sqrt{\frac{\left(im \cdot im\right) \cdot 2}{\sqrt{im \cdot im + re \cdot re} - re}} \cdot 0.5\\
\mathbf{elif}\;re \le 1.198489425005489137911557625166212280639 \cdot 10^{97}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{\sqrt{2 \cdot \left(\sqrt{im \cdot im + re \cdot re} + re\right)}} \cdot \sqrt{\sqrt{2 \cdot \left(\sqrt{im \cdot im + re \cdot re} + re\right)}}\right)\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + re\right)}\\
\end{array}double f(double re, double im) {
double r8610523 = 0.5;
double r8610524 = 2.0;
double r8610525 = re;
double r8610526 = r8610525 * r8610525;
double r8610527 = im;
double r8610528 = r8610527 * r8610527;
double r8610529 = r8610526 + r8610528;
double r8610530 = sqrt(r8610529);
double r8610531 = r8610530 + r8610525;
double r8610532 = r8610524 * r8610531;
double r8610533 = sqrt(r8610532);
double r8610534 = r8610523 * r8610533;
return r8610534;
}
double f(double re, double im) {
double r8610535 = re;
double r8610536 = -1.2522334126502323e+106;
bool r8610537 = r8610535 <= r8610536;
double r8610538 = im;
double r8610539 = r8610538 * r8610538;
double r8610540 = 2.0;
double r8610541 = r8610539 * r8610540;
double r8610542 = sqrt(r8610541);
double r8610543 = -2.0;
double r8610544 = r8610543 * r8610535;
double r8610545 = sqrt(r8610544);
double r8610546 = r8610542 / r8610545;
double r8610547 = 0.5;
double r8610548 = r8610546 * r8610547;
double r8610549 = 2.87148784553548e-309;
bool r8610550 = r8610535 <= r8610549;
double r8610551 = r8610535 * r8610535;
double r8610552 = r8610539 + r8610551;
double r8610553 = sqrt(r8610552);
double r8610554 = r8610553 - r8610535;
double r8610555 = r8610541 / r8610554;
double r8610556 = sqrt(r8610555);
double r8610557 = r8610556 * r8610547;
double r8610558 = 1.1984894250054891e+97;
bool r8610559 = r8610535 <= r8610558;
double r8610560 = r8610553 + r8610535;
double r8610561 = r8610540 * r8610560;
double r8610562 = sqrt(r8610561);
double r8610563 = sqrt(r8610562);
double r8610564 = r8610563 * r8610563;
double r8610565 = r8610547 * r8610564;
double r8610566 = r8610535 + r8610535;
double r8610567 = r8610540 * r8610566;
double r8610568 = sqrt(r8610567);
double r8610569 = r8610547 * r8610568;
double r8610570 = r8610559 ? r8610565 : r8610569;
double r8610571 = r8610550 ? r8610557 : r8610570;
double r8610572 = r8610537 ? r8610548 : r8610571;
return r8610572;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.9 |
|---|---|
| Target | 33.8 |
| Herbie | 23.0 |
if re < -1.2522334126502323e+106Initial program 61.7
rmApplied flip-+61.7
Applied associate-*r/61.7
Applied sqrt-div61.7
Simplified45.3
Taylor expanded around -inf 22.9
if -1.2522334126502323e+106 < re < 2.87148784553548e-309Initial program 39.0
rmApplied flip-+38.7
Applied associate-*r/38.7
Applied sqrt-div38.9
Simplified30.5
rmApplied sqrt-undiv31.1
if 2.87148784553548e-309 < re < 1.1984894250054891e+97Initial program 20.9
rmApplied add-sqr-sqrt21.2
if 1.1984894250054891e+97 < re Initial program 51.0
Taylor expanded around inf 10.5
Final simplification23.0
herbie shell --seed 2019169
(FPCore (re im)
:name "math.sqrt on complex, real part"
:herbie-target
(if (< re 0.0) (* 0.5 (* (sqrt 2.0) (sqrt (/ (* im im) (- (sqrt (+ (* re re) (* im im))) re))))) (* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))
(* 0.5 (sqrt (* 2.0 (+ (sqrt (+ (* re re) (* im im))) re)))))