0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -2.47409571178928762 \cdot 10^{117}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \frac{\left|im\right|}{\sqrt{-2 \cdot re}}\right)\\
\mathbf{elif}\;re \le 5.125184653484052 \cdot 10^{-96}:\\
\;\;\;\;0.5 \cdot \left(\sqrt{2} \cdot \frac{\left|im\right|}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}\right)\\
\mathbf{elif}\;re \le 1.70012441094945963 \cdot 10^{-83} \lor \neg \left(re \le 9.42270172378150248 \cdot 10^{-57}\right):\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + re\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \left(\left(\sqrt{2} \cdot \sqrt{\frac{\left|im\right|}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}}\right) \cdot \sqrt{\frac{\left|im\right|}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}}\right)\\
\end{array}double f(double re, double im) {
double r193519 = 0.5;
double r193520 = 2.0;
double r193521 = re;
double r193522 = r193521 * r193521;
double r193523 = im;
double r193524 = r193523 * r193523;
double r193525 = r193522 + r193524;
double r193526 = sqrt(r193525);
double r193527 = r193526 + r193521;
double r193528 = r193520 * r193527;
double r193529 = sqrt(r193528);
double r193530 = r193519 * r193529;
return r193530;
}
double f(double re, double im) {
double r193531 = re;
double r193532 = -2.4740957117892876e+117;
bool r193533 = r193531 <= r193532;
double r193534 = 0.5;
double r193535 = 2.0;
double r193536 = sqrt(r193535);
double r193537 = im;
double r193538 = fabs(r193537);
double r193539 = -2.0;
double r193540 = r193539 * r193531;
double r193541 = sqrt(r193540);
double r193542 = r193538 / r193541;
double r193543 = r193536 * r193542;
double r193544 = r193534 * r193543;
double r193545 = 5.1251846534840524e-96;
bool r193546 = r193531 <= r193545;
double r193547 = r193531 * r193531;
double r193548 = r193537 * r193537;
double r193549 = r193547 + r193548;
double r193550 = sqrt(r193549);
double r193551 = r193550 - r193531;
double r193552 = sqrt(r193551);
double r193553 = r193538 / r193552;
double r193554 = r193536 * r193553;
double r193555 = r193534 * r193554;
double r193556 = 1.7001244109494596e-83;
bool r193557 = r193531 <= r193556;
double r193558 = 9.422701723781502e-57;
bool r193559 = r193531 <= r193558;
double r193560 = !r193559;
bool r193561 = r193557 || r193560;
double r193562 = r193531 + r193531;
double r193563 = r193535 * r193562;
double r193564 = sqrt(r193563);
double r193565 = r193534 * r193564;
double r193566 = sqrt(r193553);
double r193567 = r193536 * r193566;
double r193568 = r193567 * r193566;
double r193569 = r193534 * r193568;
double r193570 = r193561 ? r193565 : r193569;
double r193571 = r193546 ? r193555 : r193570;
double r193572 = r193533 ? r193544 : r193571;
return r193572;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.3 |
|---|---|
| Target | 33.3 |
| Herbie | 21.0 |
if re < -2.4740957117892876e+117Initial program 62.0
rmApplied flip-+62.0
Applied associate-*r/62.0
Applied sqrt-div62.0
Simplified45.7
rmApplied *-un-lft-identity45.7
Applied sqrt-prod45.7
Applied sqrt-prod45.7
Applied times-frac45.7
Simplified45.7
Simplified43.7
Taylor expanded around -inf 9.7
if -2.4740957117892876e+117 < re < 5.1251846534840524e-96Initial program 34.2
rmApplied flip-+36.2
Applied associate-*r/36.2
Applied sqrt-div36.5
Simplified30.9
rmApplied *-un-lft-identity30.9
Applied sqrt-prod30.9
Applied sqrt-prod30.9
Applied times-frac30.9
Simplified30.9
Simplified24.1
if 5.1251846534840524e-96 < re < 1.7001244109494596e-83 or 9.422701723781502e-57 < re Initial program 35.3
rmApplied add-sqr-sqrt35.3
Applied sqrt-prod35.4
Taylor expanded around inf 19.6
if 1.7001244109494596e-83 < re < 9.422701723781502e-57Initial program 17.4
rmApplied flip-+41.8
Applied associate-*r/41.8
Applied sqrt-div41.9
Simplified41.9
rmApplied *-un-lft-identity41.9
Applied sqrt-prod41.9
Applied sqrt-prod41.9
Applied times-frac41.9
Simplified41.9
Simplified41.5
rmApplied add-sqr-sqrt41.6
Applied associate-*r*41.6
Final simplification21.0
herbie shell --seed 2019198
(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)))))