0.5 \cdot \sqrt{2 \cdot \left(\sqrt{re \cdot re + im \cdot im} + re\right)}\begin{array}{l}
\mathbf{if}\;im \cdot im \le 2.785635358716614812340651792624574520043 \cdot 10^{-267}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(2 \cdot re\right)}\\
\mathbf{elif}\;im \cdot im \le 7.885845283722595201168636922497800994676 \cdot 10^{-207}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\sqrt{re \cdot re + im \cdot im} - re}}\\
\mathbf{elif}\;im \cdot im \le 4.636456314439879455015808630226497398272 \cdot 10^{-190}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(2 \cdot re\right)}\\
\mathbf{elif}\;im \cdot im \le 1.606608869031663108780796224948697957317 \cdot 10^{272}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \frac{im \cdot im}{\sqrt{re \cdot re + im \cdot im} - re}}\\
\mathbf{else}:\\
\;\;\;\;0.5 \cdot \sqrt{2 \cdot \left(re + im\right)}\\
\end{array}double f(double re, double im) {
double r203965 = 0.5;
double r203966 = 2.0;
double r203967 = re;
double r203968 = r203967 * r203967;
double r203969 = im;
double r203970 = r203969 * r203969;
double r203971 = r203968 + r203970;
double r203972 = sqrt(r203971);
double r203973 = r203972 + r203967;
double r203974 = r203966 * r203973;
double r203975 = sqrt(r203974);
double r203976 = r203965 * r203975;
return r203976;
}
double f(double re, double im) {
double r203977 = im;
double r203978 = r203977 * r203977;
double r203979 = 2.785635358716615e-267;
bool r203980 = r203978 <= r203979;
double r203981 = 0.5;
double r203982 = 2.0;
double r203983 = 2.0;
double r203984 = re;
double r203985 = r203983 * r203984;
double r203986 = r203982 * r203985;
double r203987 = sqrt(r203986);
double r203988 = r203981 * r203987;
double r203989 = 7.885845283722595e-207;
bool r203990 = r203978 <= r203989;
double r203991 = r203984 * r203984;
double r203992 = r203991 + r203978;
double r203993 = sqrt(r203992);
double r203994 = r203993 - r203984;
double r203995 = r203978 / r203994;
double r203996 = r203982 * r203995;
double r203997 = sqrt(r203996);
double r203998 = r203981 * r203997;
double r203999 = 4.636456314439879e-190;
bool r204000 = r203978 <= r203999;
double r204001 = 1.606608869031663e+272;
bool r204002 = r203978 <= r204001;
double r204003 = r203984 + r203977;
double r204004 = r203982 * r204003;
double r204005 = sqrt(r204004);
double r204006 = r203981 * r204005;
double r204007 = r204002 ? r203998 : r204006;
double r204008 = r204000 ? r203988 : r204007;
double r204009 = r203990 ? r203998 : r204008;
double r204010 = r203980 ? r203988 : r204009;
return r204010;
}




Bits error versus re




Bits error versus im
Results
| Original | 38.4 |
|---|---|
| Target | 33.5 |
| Herbie | 30.6 |
if (* im im) < 2.785635358716615e-267 or 7.885845283722595e-207 < (* im im) < 4.636456314439879e-190Initial program 41.4
rmApplied add-sqr-sqrt41.4
Applied sqrt-prod42.3
rmApplied add-sqr-sqrt42.3
Applied sqrt-prod42.3
Applied sqrt-prod42.7
Applied associate-*l*42.8
Simplified43.1
Taylor expanded around inf 36.4
if 2.785635358716615e-267 < (* im im) < 7.885845283722595e-207 or 4.636456314439879e-190 < (* im im) < 1.606608869031663e+272Initial program 22.8
rmApplied flip-+30.2
Simplified22.9
if 1.606608869031663e+272 < (* im im) Initial program 59.2
rmApplied add-sqr-sqrt59.2
Applied sqrt-prod59.2
rmApplied add-sqr-sqrt59.2
Applied sqrt-prod59.2
Applied sqrt-prod59.2
Applied associate-*l*59.2
Simplified59.2
Taylor expanded around 0 36.1
Final simplification30.6
herbie shell --seed 2019326
(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)))))