0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -7.0927697338173699 \cdot 10^{-138}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(1 \cdot \frac{im}{\frac{\mathsf{hypot}\left(re, im\right) - re}{im}}\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\sqrt{1} \cdot \mathsf{hypot}\left(re, im\right) + re\right)}\\
\end{array}double f(double re, double im) {
double r161732 = 0.5;
double r161733 = 2.0;
double r161734 = re;
double r161735 = r161734 * r161734;
double r161736 = im;
double r161737 = r161736 * r161736;
double r161738 = r161735 + r161737;
double r161739 = sqrt(r161738);
double r161740 = r161739 + r161734;
double r161741 = r161733 * r161740;
double r161742 = sqrt(r161741);
double r161743 = r161732 * r161742;
return r161743;
}
double f(double re, double im) {
double r161744 = re;
double r161745 = -7.09276973381737e-138;
bool r161746 = r161744 <= r161745;
double r161747 = 0.5;
double r161748 = 2.0;
double r161749 = 1.0;
double r161750 = im;
double r161751 = hypot(r161744, r161750);
double r161752 = r161751 - r161744;
double r161753 = r161752 / r161750;
double r161754 = r161750 / r161753;
double r161755 = r161749 * r161754;
double r161756 = r161748 * r161755;
double r161757 = sqrt(r161756);
double r161758 = r161747 * r161757;
double r161759 = sqrt(r161749);
double r161760 = r161759 * r161751;
double r161761 = r161760 + r161744;
double r161762 = r161748 * r161761;
double r161763 = sqrt(r161762);
double r161764 = r161747 * r161763;
double r161765 = r161746 ? r161758 : r161764;
return r161765;
}




Bits error versus re




Bits error versus im
Results
| Original | 39.2 |
|---|---|
| Target | 34.1 |
| Herbie | 6.4 |
if re < -7.09276973381737e-138Initial program 52.6
rmApplied flip-+52.6
Simplified38.5
Simplified31.1
rmApplied *-un-lft-identity31.1
Applied *-un-lft-identity31.1
Applied times-frac31.1
Simplified31.1
Simplified14.3
if -7.09276973381737e-138 < re Initial program 31.6
rmApplied *-un-lft-identity31.6
Applied sqrt-prod31.6
Simplified1.9
Final simplification6.4
herbie shell --seed 2020036 +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)))))