0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -5229117268898383872:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\mathsf{hypot}\left(re, im\right) - re}}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot {\left(2 \cdot \left(re + \mathsf{hypot}\left(re, im\right)\right)\right)}^{\frac{1}{2}}\\
\end{array}double f(double re, double im) {
double r166731 = 0.5;
double r166732 = 2.0;
double r166733 = re;
double r166734 = r166733 * r166733;
double r166735 = im;
double r166736 = r166735 * r166735;
double r166737 = r166734 + r166736;
double r166738 = sqrt(r166737);
double r166739 = r166738 + r166733;
double r166740 = r166732 * r166739;
double r166741 = sqrt(r166740);
double r166742 = r166731 * r166741;
return r166742;
}
double f(double re, double im) {
double r166743 = re;
double r166744 = -5.229117268898384e+18;
bool r166745 = r166743 <= r166744;
double r166746 = 0.5;
double r166747 = 2.0;
double r166748 = im;
double r166749 = r166748 * r166748;
double r166750 = hypot(r166743, r166748);
double r166751 = r166750 - r166743;
double r166752 = r166749 / r166751;
double r166753 = r166747 * r166752;
double r166754 = sqrt(r166753);
double r166755 = r166746 * r166754;
double r166756 = r166743 + r166750;
double r166757 = r166747 * r166756;
double r166758 = 0.5;
double r166759 = pow(r166757, r166758);
double r166760 = r166746 * r166759;
double r166761 = r166745 ? r166755 : r166760;
return r166761;
}




Bits error versus re




Bits error versus im
Results
| Original | 39.1 |
|---|---|
| Target | 34.1 |
| Herbie | 11.4 |
if re < -5.229117268898384e+18Initial program 58.6
rmApplied flip-+58.6
Simplified41.5
Simplified31.5
if -5.229117268898384e+18 < re Initial program 33.0
rmApplied *-un-lft-identity33.0
Applied *-un-lft-identity33.0
Applied distribute-lft-out33.0
Simplified5.0
rmApplied sqrt-prod5.4
Simplified5.4
rmApplied add-sqr-sqrt5.4
Applied sqrt-prod5.5
Applied associate-*l*5.4
rmApplied pow15.4
Applied sqrt-pow15.4
Applied pow15.4
Applied sqrt-pow15.4
Applied pow-prod-down5.3
Applied pow15.3
Applied sqrt-pow15.3
Applied pow-prod-down5.5
Simplified5.0
Final simplification11.4
herbie shell --seed 2019344 +o rules:numerics
(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)))))