0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -3.258700308413734263198473092360990096615 \cdot 10^{-288}:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{\left(im \cdot im\right) \cdot 2}}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}\\
\mathbf{elif}\;re \le 1.015933577747527344666564222799068286537 \cdot 10^{138}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\left(\sqrt{\sqrt{re \cdot re + im \cdot im}} \cdot \sqrt{\left|\sqrt[3]{re \cdot re + im \cdot im}\right|}\right) \cdot \sqrt{\sqrt{\sqrt[3]{re \cdot re + im \cdot im}}} + re\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + re\right)}\\
\end{array}double f(double re, double im) {
double r95495 = 0.5;
double r95496 = 2.0;
double r95497 = re;
double r95498 = r95497 * r95497;
double r95499 = im;
double r95500 = r95499 * r95499;
double r95501 = r95498 + r95500;
double r95502 = sqrt(r95501);
double r95503 = r95502 + r95497;
double r95504 = r95496 * r95503;
double r95505 = sqrt(r95504);
double r95506 = r95495 * r95505;
return r95506;
}
double f(double re, double im) {
double r95507 = re;
double r95508 = -3.2587003084137343e-288;
bool r95509 = r95507 <= r95508;
double r95510 = 0.5;
double r95511 = im;
double r95512 = r95511 * r95511;
double r95513 = 2.0;
double r95514 = r95512 * r95513;
double r95515 = sqrt(r95514);
double r95516 = r95507 * r95507;
double r95517 = r95516 + r95512;
double r95518 = sqrt(r95517);
double r95519 = r95518 - r95507;
double r95520 = sqrt(r95519);
double r95521 = r95515 / r95520;
double r95522 = r95510 * r95521;
double r95523 = 1.0159335777475273e+138;
bool r95524 = r95507 <= r95523;
double r95525 = sqrt(r95518);
double r95526 = cbrt(r95517);
double r95527 = fabs(r95526);
double r95528 = sqrt(r95527);
double r95529 = r95525 * r95528;
double r95530 = sqrt(r95526);
double r95531 = sqrt(r95530);
double r95532 = r95529 * r95531;
double r95533 = r95532 + r95507;
double r95534 = r95513 * r95533;
double r95535 = sqrt(r95534);
double r95536 = r95510 * r95535;
double r95537 = r95507 + r95507;
double r95538 = r95513 * r95537;
double r95539 = sqrt(r95538);
double r95540 = r95510 * r95539;
double r95541 = r95524 ? r95536 : r95540;
double r95542 = r95509 ? r95522 : r95541;
return r95542;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.6 |
|---|---|
| Target | 33.7 |
| Herbie | 26.4 |
if re < -3.2587003084137343e-288Initial program 46.5
rmApplied flip-+46.4
Applied associate-*r/46.4
Applied sqrt-div46.5
Simplified35.4
if -3.2587003084137343e-288 < re < 1.0159335777475273e+138Initial program 20.9
rmApplied add-sqr-sqrt20.9
Applied sqrt-prod21.0
rmApplied add-cube-cbrt21.0
Applied sqrt-prod21.0
Applied sqrt-prod21.1
Applied associate-*r*21.0
Simplified21.0
if 1.0159335777475273e+138 < re Initial program 58.8
Taylor expanded around inf 9.0
Final simplification26.4
herbie shell --seed 2019323
(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)))))