0.5 \cdot \sqrt{2.0 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -3.896078043343783 \cdot 10^{-117}:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{2.0 \cdot \left(im \cdot im\right)}}{\sqrt{\sqrt{im \cdot im + re \cdot re} - re}}\\
\mathbf{elif}\;re \le -2.563508143180615 \cdot 10^{-158}:\\
\;\;\;\;0.5 \cdot \sqrt{2.0 \cdot \left(im + re\right)}\\
\mathbf{elif}\;re \le 1.1909114483375085 \cdot 10^{-307}:\\
\;\;\;\;0.5 \cdot \sqrt{\frac{im \cdot im}{\sqrt{im \cdot im + re \cdot re} - re} \cdot 2.0}\\
\mathbf{elif}\;re \le 1.4105722211090752 \cdot 10^{-227}:\\
\;\;\;\;0.5 \cdot \sqrt{2.0 \cdot \left(im + re\right)}\\
\mathbf{elif}\;re \le 4.4479284942813524 \cdot 10^{+142}:\\
\;\;\;\;\sqrt{\left(\sqrt{im \cdot im + re \cdot re} + re\right) \cdot 2.0} \cdot 0.5\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{\left(re + re\right) \cdot 2.0}\\
\end{array}double f(double re, double im) {
double r5910572 = 0.5;
double r5910573 = 2.0;
double r5910574 = re;
double r5910575 = r5910574 * r5910574;
double r5910576 = im;
double r5910577 = r5910576 * r5910576;
double r5910578 = r5910575 + r5910577;
double r5910579 = sqrt(r5910578);
double r5910580 = r5910579 + r5910574;
double r5910581 = r5910573 * r5910580;
double r5910582 = sqrt(r5910581);
double r5910583 = r5910572 * r5910582;
return r5910583;
}
double f(double re, double im) {
double r5910584 = re;
double r5910585 = -3.896078043343783e-117;
bool r5910586 = r5910584 <= r5910585;
double r5910587 = 0.5;
double r5910588 = 2.0;
double r5910589 = im;
double r5910590 = r5910589 * r5910589;
double r5910591 = r5910588 * r5910590;
double r5910592 = sqrt(r5910591);
double r5910593 = r5910584 * r5910584;
double r5910594 = r5910590 + r5910593;
double r5910595 = sqrt(r5910594);
double r5910596 = r5910595 - r5910584;
double r5910597 = sqrt(r5910596);
double r5910598 = r5910592 / r5910597;
double r5910599 = r5910587 * r5910598;
double r5910600 = -2.563508143180615e-158;
bool r5910601 = r5910584 <= r5910600;
double r5910602 = r5910589 + r5910584;
double r5910603 = r5910588 * r5910602;
double r5910604 = sqrt(r5910603);
double r5910605 = r5910587 * r5910604;
double r5910606 = 1.1909114483375085e-307;
bool r5910607 = r5910584 <= r5910606;
double r5910608 = r5910590 / r5910596;
double r5910609 = r5910608 * r5910588;
double r5910610 = sqrt(r5910609);
double r5910611 = r5910587 * r5910610;
double r5910612 = 1.4105722211090752e-227;
bool r5910613 = r5910584 <= r5910612;
double r5910614 = 4.4479284942813524e+142;
bool r5910615 = r5910584 <= r5910614;
double r5910616 = r5910595 + r5910584;
double r5910617 = r5910616 * r5910588;
double r5910618 = sqrt(r5910617);
double r5910619 = r5910618 * r5910587;
double r5910620 = r5910584 + r5910584;
double r5910621 = r5910620 * r5910588;
double r5910622 = sqrt(r5910621);
double r5910623 = r5910587 * r5910622;
double r5910624 = r5910615 ? r5910619 : r5910623;
double r5910625 = r5910613 ? r5910605 : r5910624;
double r5910626 = r5910607 ? r5910611 : r5910625;
double r5910627 = r5910601 ? r5910605 : r5910626;
double r5910628 = r5910586 ? r5910599 : r5910627;
return r5910628;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.2 |
|---|---|
| Target | 33.0 |
| Herbie | 26.3 |
if re < -3.896078043343783e-117Initial program 50.7
rmApplied flip-+50.7
Applied associate-*r/50.7
Applied sqrt-div50.8
Simplified35.5
if -3.896078043343783e-117 < re < -2.563508143180615e-158 or 1.1909114483375085e-307 < re < 1.4105722211090752e-227Initial program 31.2
rmApplied add-exp-log33.0
rmApplied pow133.0
Applied log-pow33.0
Applied exp-prod33.0
Simplified33.0
Taylor expanded around 0 34.9
if -2.563508143180615e-158 < re < 1.1909114483375085e-307Initial program 30.3
rmApplied add-exp-log32.3
rmApplied flip-+31.9
Simplified31.9
Simplified30.0
if 1.4105722211090752e-227 < re < 4.4479284942813524e+142Initial program 18.8
if 4.4479284942813524e+142 < re Initial program 58.6
rmApplied add-exp-log58.8
rmApplied pow158.8
Applied log-pow58.8
Applied exp-prod58.8
Simplified58.8
Taylor expanded around inf 8.8
Final simplification26.3
herbie shell --seed 2019143
(FPCore (re im)
:name "math.sqrt on complex, real part"
:herbie-target
(if (< re 0) (* 0.5 (* (sqrt 2) (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)))))