0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -5.330091552844717472226479932066920744645 \cdot 10^{114}:\\
\;\;\;\;0.5 \cdot \frac{\left|im\right| \cdot \sqrt{2}}{\sqrt{-2 \cdot re}}\\
\mathbf{elif}\;re \le -4.215661627499373563855656419004671791113 \cdot 10^{-144}:\\
\;\;\;\;0.5 \cdot \frac{\frac{\left|im\right| \cdot \sqrt{2}}{\sqrt{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}}}{\sqrt{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}}\\
\mathbf{elif}\;re \le 5.124751274050741168628571362640123162884 \cdot 10^{-246}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\
\mathbf{elif}\;re \le 1.280297657817536289043603160829670533045 \cdot 10^{-204} \lor \neg \left(re \le 9.727118253535961652403013059453411638468 \cdot 10^{-160}\right) \land re \le 4.202834506095946744840619038062984088453 \cdot 10^{-94}:\\
\;\;\;\;0.5 \cdot \sqrt{\frac{im}{\frac{\sqrt{re \cdot re + im \cdot im} - re}{2}} \cdot im}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + re\right)}\\
\end{array}double f(double re, double im) {
double r161499 = 0.5;
double r161500 = 2.0;
double r161501 = re;
double r161502 = r161501 * r161501;
double r161503 = im;
double r161504 = r161503 * r161503;
double r161505 = r161502 + r161504;
double r161506 = sqrt(r161505);
double r161507 = r161506 + r161501;
double r161508 = r161500 * r161507;
double r161509 = sqrt(r161508);
double r161510 = r161499 * r161509;
return r161510;
}
double f(double re, double im) {
double r161511 = re;
double r161512 = -5.330091552844717e+114;
bool r161513 = r161511 <= r161512;
double r161514 = 0.5;
double r161515 = im;
double r161516 = fabs(r161515);
double r161517 = 2.0;
double r161518 = sqrt(r161517);
double r161519 = r161516 * r161518;
double r161520 = -2.0;
double r161521 = r161520 * r161511;
double r161522 = sqrt(r161521);
double r161523 = r161519 / r161522;
double r161524 = r161514 * r161523;
double r161525 = -4.2156616274993736e-144;
bool r161526 = r161511 <= r161525;
double r161527 = r161511 * r161511;
double r161528 = r161515 * r161515;
double r161529 = r161527 + r161528;
double r161530 = sqrt(r161529);
double r161531 = r161530 - r161511;
double r161532 = sqrt(r161531);
double r161533 = sqrt(r161532);
double r161534 = r161519 / r161533;
double r161535 = r161534 / r161533;
double r161536 = r161514 * r161535;
double r161537 = 5.124751274050741e-246;
bool r161538 = r161511 <= r161537;
double r161539 = r161511 + r161515;
double r161540 = r161517 * r161539;
double r161541 = sqrt(r161540);
double r161542 = r161514 * r161541;
double r161543 = 1.2802976578175363e-204;
bool r161544 = r161511 <= r161543;
double r161545 = 9.727118253535962e-160;
bool r161546 = r161511 <= r161545;
double r161547 = !r161546;
double r161548 = 4.202834506095947e-94;
bool r161549 = r161511 <= r161548;
bool r161550 = r161547 && r161549;
bool r161551 = r161544 || r161550;
double r161552 = r161531 / r161517;
double r161553 = r161515 / r161552;
double r161554 = r161553 * r161515;
double r161555 = sqrt(r161554);
double r161556 = r161514 * r161555;
double r161557 = r161511 + r161511;
double r161558 = r161517 * r161557;
double r161559 = sqrt(r161558);
double r161560 = r161514 * r161559;
double r161561 = r161551 ? r161556 : r161560;
double r161562 = r161538 ? r161542 : r161561;
double r161563 = r161526 ? r161536 : r161562;
double r161564 = r161513 ? r161524 : r161563;
return r161564;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.5 |
|---|---|
| Target | 33.3 |
| Herbie | 22.6 |
if re < -5.330091552844717e+114Initial program 61.8
rmApplied flip-+61.8
Applied associate-*r/61.9
Applied sqrt-div61.9
Simplified45.4
rmApplied sqrt-prod45.3
Simplified43.1
Taylor expanded around -inf 8.9
if -5.330091552844717e+114 < re < -4.2156616274993736e-144Initial program 43.2
rmApplied flip-+43.2
Applied associate-*r/43.4
Applied sqrt-div43.5
Simplified28.4
rmApplied sqrt-prod28.3
Simplified15.5
rmApplied add-sqr-sqrt15.5
Applied sqrt-prod15.7
Applied associate-/r*15.7
if -4.2156616274993736e-144 < re < 5.124751274050741e-246Initial program 31.6
Taylor expanded around 0 36.2
if 5.124751274050741e-246 < re < 1.2802976578175363e-204 or 9.727118253535962e-160 < re < 4.202834506095947e-94Initial program 20.9
rmApplied flip-+33.1
Applied associate-*r/33.2
Applied sqrt-div33.6
Simplified33.6
rmApplied sqrt-undiv33.2
Simplified32.8
if 1.2802976578175363e-204 < re < 9.727118253535962e-160 or 4.202834506095947e-94 < re Initial program 33.3
Taylor expanded around inf 23.5
Final simplification22.6
herbie shell --seed 2019325
(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)))))