0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;re \le -3.258700308413734263198473092360990096615 \cdot 10^{-288}:\\
\;\;\;\;0.5 \cdot \frac{\sqrt{\left(im \cdot im\right) \cdot 2}}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}\\
\mathbf{elif}\;re \le 1.015933577747527344666564222799068286537 \cdot 10^{138}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(\left(\sqrt{\sqrt{re \cdot re + im \cdot im}} \cdot \sqrt{\left|\sqrt[3]{re \cdot re + im \cdot im}\right|}\right) \cdot \sqrt{\sqrt{\sqrt[3]{re \cdot re + im \cdot im}}} + re\right)}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + re\right)}\\
\end{array}double f(double re, double im) {
double r114937 = 0.5;
double r114938 = 2.0;
double r114939 = re;
double r114940 = r114939 * r114939;
double r114941 = im;
double r114942 = r114941 * r114941;
double r114943 = r114940 + r114942;
double r114944 = sqrt(r114943);
double r114945 = r114944 + r114939;
double r114946 = r114938 * r114945;
double r114947 = sqrt(r114946);
double r114948 = r114937 * r114947;
return r114948;
}
double f(double re, double im) {
double r114949 = re;
double r114950 = -3.2587003084137343e-288;
bool r114951 = r114949 <= r114950;
double r114952 = 0.5;
double r114953 = im;
double r114954 = r114953 * r114953;
double r114955 = 2.0;
double r114956 = r114954 * r114955;
double r114957 = sqrt(r114956);
double r114958 = r114949 * r114949;
double r114959 = r114958 + r114954;
double r114960 = sqrt(r114959);
double r114961 = r114960 - r114949;
double r114962 = sqrt(r114961);
double r114963 = r114957 / r114962;
double r114964 = r114952 * r114963;
double r114965 = 1.0159335777475273e+138;
bool r114966 = r114949 <= r114965;
double r114967 = sqrt(r114960);
double r114968 = cbrt(r114959);
double r114969 = fabs(r114968);
double r114970 = sqrt(r114969);
double r114971 = r114967 * r114970;
double r114972 = sqrt(r114968);
double r114973 = sqrt(r114972);
double r114974 = r114971 * r114973;
double r114975 = r114974 + r114949;
double r114976 = r114955 * r114975;
double r114977 = sqrt(r114976);
double r114978 = r114952 * r114977;
double r114979 = r114949 + r114949;
double r114980 = r114955 * r114979;
double r114981 = sqrt(r114980);
double r114982 = r114952 * r114981;
double r114983 = r114966 ? r114978 : r114982;
double r114984 = r114951 ? r114964 : r114983;
return r114984;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.6 |
|---|---|
| Target | 33.7 |
| Herbie | 26.4 |
if re < -3.2587003084137343e-288Initial program 46.5
rmApplied flip-+46.4
Applied associate-*r/46.4
Applied sqrt-div46.5
Simplified35.4
if -3.2587003084137343e-288 < re < 1.0159335777475273e+138Initial program 20.9
rmApplied add-sqr-sqrt20.9
Applied sqrt-prod21.0
rmApplied add-cube-cbrt21.0
Applied sqrt-prod21.0
Applied sqrt-prod21.1
Applied associate-*r*21.0
Simplified21.0
if 1.0159335777475273e+138 < re Initial program 58.8
Taylor expanded around inf 9.0
Final simplification26.4
herbie shell --seed 2019323
(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)))))