0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;im \le -2.036766738766978654329181944509117917379 \cdot 10^{-24}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + \left(-im\right)\right)}\\
\mathbf{elif}\;im \le -5.289548942669333189149718055604630252585 \cdot 10^{-269}:\\
\;\;\;\;\sqrt{2 \cdot \left(re + re\right)} \cdot 0.5\\
\mathbf{elif}\;im \le 3.606820219200127121090676194295429685619 \cdot 10^{-171}:\\
\;\;\;\;0.5 \cdot \left(\frac{\left|im\right|}{\sqrt{re \cdot -2}} \cdot \sqrt{2}\right)\\
\mathbf{elif}\;im \le 1.471945877265292806314351903468873946637 \cdot 10^{-143}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\
\mathbf{elif}\;im \le 1.11277121648235116127597920377105142481 \cdot 10^{127}:\\
\;\;\;\;\left(\left(\sqrt[3]{\sqrt{2}} \cdot \sqrt[3]{\sqrt{2}}\right) \cdot \frac{\left|im\right| \cdot \sqrt[3]{\sqrt{2}}}{\sqrt{\sqrt{re \cdot re + im \cdot im} - re}}\right) \cdot 0.5\\
\mathbf{elif}\;im \le 7.340779959888026082952331047777691515948 \cdot 10^{187}:\\
\;\;\;\;\left(\frac{\left|im\right|}{\sqrt{im - re}} \cdot \sqrt{2}\right) \cdot 0.5\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\
\end{array}double f(double re, double im) {
double r181944 = 0.5;
double r181945 = 2.0;
double r181946 = re;
double r181947 = r181946 * r181946;
double r181948 = im;
double r181949 = r181948 * r181948;
double r181950 = r181947 + r181949;
double r181951 = sqrt(r181950);
double r181952 = r181951 + r181946;
double r181953 = r181945 * r181952;
double r181954 = sqrt(r181953);
double r181955 = r181944 * r181954;
return r181955;
}
double f(double re, double im) {
double r181956 = im;
double r181957 = -2.0367667387669787e-24;
bool r181958 = r181956 <= r181957;
double r181959 = 0.5;
double r181960 = 2.0;
double r181961 = re;
double r181962 = -r181956;
double r181963 = r181961 + r181962;
double r181964 = r181960 * r181963;
double r181965 = sqrt(r181964);
double r181966 = r181959 * r181965;
double r181967 = -5.289548942669333e-269;
bool r181968 = r181956 <= r181967;
double r181969 = r181961 + r181961;
double r181970 = r181960 * r181969;
double r181971 = sqrt(r181970);
double r181972 = r181971 * r181959;
double r181973 = 3.606820219200127e-171;
bool r181974 = r181956 <= r181973;
double r181975 = fabs(r181956);
double r181976 = -2.0;
double r181977 = r181961 * r181976;
double r181978 = sqrt(r181977);
double r181979 = r181975 / r181978;
double r181980 = sqrt(r181960);
double r181981 = r181979 * r181980;
double r181982 = r181959 * r181981;
double r181983 = 1.4719458772652928e-143;
bool r181984 = r181956 <= r181983;
double r181985 = r181961 + r181956;
double r181986 = r181960 * r181985;
double r181987 = sqrt(r181986);
double r181988 = r181959 * r181987;
double r181989 = 1.1127712164823512e+127;
bool r181990 = r181956 <= r181989;
double r181991 = cbrt(r181980);
double r181992 = r181991 * r181991;
double r181993 = r181975 * r181991;
double r181994 = r181961 * r181961;
double r181995 = r181956 * r181956;
double r181996 = r181994 + r181995;
double r181997 = sqrt(r181996);
double r181998 = r181997 - r181961;
double r181999 = sqrt(r181998);
double r182000 = r181993 / r181999;
double r182001 = r181992 * r182000;
double r182002 = r182001 * r181959;
double r182003 = 7.340779959888026e+187;
bool r182004 = r181956 <= r182003;
double r182005 = r181956 - r181961;
double r182006 = sqrt(r182005);
double r182007 = r181975 / r182006;
double r182008 = r182007 * r181980;
double r182009 = r182008 * r181959;
double r182010 = r182004 ? r182009 : r181988;
double r182011 = r181990 ? r182002 : r182010;
double r182012 = r181984 ? r181988 : r182011;
double r182013 = r181974 ? r181982 : r182012;
double r182014 = r181968 ? r181972 : r182013;
double r182015 = r181958 ? r181966 : r182014;
return r182015;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.1 |
|---|---|
| Target | 33.2 |
| Herbie | 24.3 |
if im < -2.0367667387669787e-24Initial program 39.8
Simplified39.8
rmApplied add-cube-cbrt40.0
Simplified40.0
Simplified40.0
Taylor expanded around -inf 15.5
Simplified15.5
if -2.0367667387669787e-24 < im < -5.289548942669333e-269Initial program 34.8
Simplified34.8
rmApplied add-cube-cbrt35.4
Simplified35.4
Simplified35.4
Taylor expanded around 0 40.0
if -5.289548942669333e-269 < im < 3.606820219200127e-171Initial program 42.4
Simplified42.4
rmApplied flip-+59.4
Applied associate-*l/59.4
Applied sqrt-div59.7
Simplified52.8
Simplified52.8
rmApplied *-un-lft-identity52.8
Applied sqrt-prod52.8
Applied sqrt-prod52.8
Applied times-frac52.8
Simplified52.8
Simplified39.1
Taylor expanded around -inf 34.4
Simplified34.4
if 3.606820219200127e-171 < im < 1.4719458772652928e-143 or 7.340779959888026e+187 < im Initial program 59.1
Simplified59.1
Taylor expanded around 0 12.3
if 1.4719458772652928e-143 < im < 1.1127712164823512e+127Initial program 24.0
Simplified24.0
rmApplied flip-+31.7
Applied associate-*l/31.7
Applied sqrt-div31.8
Simplified23.5
Simplified23.5
rmApplied *-un-lft-identity23.5
Applied sqrt-prod23.5
Applied sqrt-prod23.6
Applied times-frac23.6
Simplified23.6
Simplified23.6
rmApplied add-cube-cbrt23.6
Applied associate-*l*23.6
Simplified23.5
if 1.1127712164823512e+127 < im < 7.340779959888026e+187Initial program 39.8
Simplified39.8
rmApplied flip-+40.1
Applied associate-*l/40.2
Applied sqrt-div40.4
Simplified39.5
Simplified39.5
rmApplied *-un-lft-identity39.5
Applied sqrt-prod39.5
Applied sqrt-prod39.4
Applied times-frac39.4
Simplified39.4
Simplified38.6
Taylor expanded around 0 15.6
Final simplification24.3
herbie shell --seed 2019174
(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)))))