00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef CINTU
00022 #define CINTU
00023 #include <spuc.h>
00024 #include <stdlib.h>
00025 #include <math.h>
00026 namespace SPUC {
00027 #define cnatural complex<long>
00033 class complex_iu
00034 {
00035 typedef long natural;
00036
00037
00038 public:
00039 cnatural q;
00040 natural mask;
00041 natural bits;
00042 natural bitpos;
00043
00044
00045 complex_iu() {
00046 q = 0;
00047 bits = 32;
00048 mask = 0;
00049 bitpos=0;
00050 }
00051 complex_iu(natural r, natural i=0) {
00052 q = complex<long>(r,i);
00053 bits = 32;
00054 mask = 0;
00055 bitpos=0;
00056 }
00057
00058 public:
00059 inline complex_iu operator =(const complex_iu& y) {
00060 q = y.q & ~mask;
00061 return *this;
00062 }
00063 inline complex_iu operator =(const natural& y) {
00064 q = ~mask & y;
00065 return *this;
00066 }
00067 friend complex_iu operator %(complex_iu r, natural l);
00068 friend complex_iu operator +(complex_iu r, complex_iu l);
00069 friend complex_iu operator +(complex_iu r, natural l);
00070 friend complex_iu operator +(cnatural r, complex_iu l);
00071 friend complex_iu operator -(complex_iu r, complex_iu l);
00072 friend complex_iu operator -(complex_iu r, cnatural l);
00073 friend complex_iu operator -(cnatural r, complex_iu l);
00074 friend complex_iu operator &(complex_iu r, natural l);
00075 friend complex_iu operator &(natural r, complex_iu l);
00076 friend complex_iu operator ^(complex_iu r, natural l);
00077 friend complex_iu operator ^(natural r, complex_iu l);
00078 friend complex_iu operator |(complex_iu r, natural l);
00079 friend complex_iu operator |(natural r, complex_iu l);
00080 friend complex_iu operator *(complex_iu r, complex_iu l);
00081 friend complex_iu operator *(complex_iu r, cnatural l);
00082 friend complex_iu operator *(complex_iu r, natural l);
00083 friend complex_iu operator *(natural r, complex_iu l);
00084 friend complex_iu operator *(cnatural r, complex_iu l);
00085 friend complex_iu operator /(complex_iu r, complex_iu l);
00086 friend complex_iu operator /(cnatural r, complex_iu l);
00087 friend complex_iu operator /(complex_iu r, cnatural l);
00088 friend complex_iu operator /(complex_iu r, natural l);
00089 friend complex_iu operator <<(complex_iu r, const natural shift) ;
00090 friend complex_iu operator >>(complex_iu r, const natural shift) ;
00091
00092 complex_iu operator +=(complex_iu r) {
00093 q += r.q;
00094 q = q & ~mask;
00095 return *this;
00096 };
00097
00098 complex_iu operator -=(complex_iu r){
00099 q -= r.q;
00100 q = q & ~mask;
00101
00102 return *this;
00103 };
00104 complex_iu operator *=(complex_iu r) {
00105 q *= r.q;
00106 q = q & ~mask;
00107 return *this;
00108 };
00109 complex_iu operator /=(complex_iu r){
00110 if (r.q.real() != 0 && r.q.imag() != 0) q = q/r.q;
00111 else q = 0;
00112 return *this;
00113 };
00114
00115 complex_iu operator <<=(const natural shift) {
00116 q = q << shift;
00117 q = q & ~mask;
00118 return *this;
00119 };
00120 complex_iu operator >>=(const natural shift) {
00121 q = q >> shift;
00122 return *this;
00123 }
00124
00125 complex_iu operator ^=(long r) {
00126 q = q ^ r;
00127 q = q & ~mask;
00128 return *this;
00129 };
00130 complex_iu operator &=(long r) {
00131 q = q & r;
00132 q = q & ~mask;
00133 return *this;
00134 };
00135 complex_iu operator |=(long r) {
00136 q = q | r;
00137 q = q & ~mask;
00138 return *this;
00139 };
00140
00141 inline bool operator !=(complex_iu r) { return (bool(q != r.q)); };
00142 inline bool operator ==(complex_iu r) { return (bool(q == r.q)); };
00143 inline long magsq(complex_iu y) {
00144 long x;
00145 x = y.q.real()*y.q.real() + y.q.imag()*y.q.imag();
00146
00147 return(x);
00148 };
00149
00150 operator const cnatural () const { return(q); }
00151
00152
00153
00154 complex_iu round(complex_iu in, natural rbits) {
00155 double scale = 1.0/(double)MASK_BIT(rbits);
00156 return(complex_iu(
00157 (long)floor((double)(scale*in.q.real())+0.5),
00158 (long)floor((double)(scale*in.q.imag())+0.5)));
00159
00160 };
00161
00162
00163 complex_iu saturate(complex_iu in, natural rbits) {
00164 long r,i;
00165 long low_mask = ((1<<(bits-1)) - 1);
00166 if (labs(in.q.real()) > low_mask)
00167 r = (in.q.real()>0) ? low_mask : ~low_mask;
00168 else r = in.q.real();
00169 if (labs(in.q.imag()) > low_mask)
00170 i = (in.q.imag()>0) ? low_mask : ~low_mask;
00171 else i = in.q.imag();
00172 return(complex_iu(r,i));
00173 }
00174
00175
00176 };
00177 complex_iu operator %(complex_iu r, natural l) {
00178 complex_iu x;
00179 x.q = r.q % l;
00180 return(x);
00181 }
00182 complex_iu operator +(complex_iu r, complex_iu l) {
00183 complex_iu x;
00184 x.q = r.q + l.q;
00185 return(x);
00186 }
00187 complex_iu operator +(complex_iu r, natural l) {
00188 complex_iu x;
00189 x.q = r.q + l;
00190 return(x);
00191 }
00192 complex_iu operator +(cnatural r, complex_iu l) {
00193 complex_iu x;
00194 x.q = r + l.q;
00195 return(x);
00196 }
00197 complex_iu operator -(complex_iu r, complex_iu l) {
00198 complex_iu x;
00199 x.q = r.q - l.q;
00200 return(x);
00201 }
00202 complex_iu operator -(complex_iu r, cnatural l) {
00203 complex_iu x;
00204 x.q = r.q - l;
00205 return(x);
00206 }
00207 complex_iu operator -(cnatural r, complex_iu l) {
00208 complex_iu x;
00209 x.q = r - l.q;
00210 return(x);
00211 }
00212 complex_iu operator &(complex_iu r, natural l) {
00213 complex_iu x;
00214 x.q = r.q & l;
00215 return(x);
00216 }
00217 complex_iu operator &(natural r, complex_iu l) {
00218 complex_iu x;
00219 x.q = l.q & r;
00220 return(x);
00221 }
00222 complex_iu operator ^(complex_iu r, natural l) {
00223 complex_iu x;
00224 x.q = r.q ^ l;
00225 return(x);
00226 }
00227 complex_iu operator ^(natural r, complex_iu l) {
00228 complex_iu x;
00229 x.q = l.q ^ r;
00230 return(x);
00231 }
00232 complex_iu operator |(complex_iu r, natural l) {
00233 complex_iu x;
00234 x.q = r.q | l;
00235 return(x);
00236 }
00237 complex_iu operator |(natural r, complex_iu l) {
00238 complex_iu x;
00239 x.q = l.q | r;
00240 return(x);
00241 }
00242 complex_iu operator *(complex_iu r, complex_iu l) {
00243 complex_iu x;
00244 x.q = r.q*l.q;
00245 return(x);
00246 };
00247 complex_iu operator *(complex_iu r, cnatural l) {
00248 complex_iu x;
00249 x.q = r.q*l;
00250 return(x);
00251 };
00252 complex_iu operator *(complex_iu r, natural l) {
00253 complex_iu x;
00254 x.q = r.q*l;
00255 return(x);
00256 };
00257 complex_iu operator *(natural r, complex_iu l) {
00258 complex_iu x;
00259 x.q = r*l.q;
00260 return(x);
00261 };
00262 complex_iu operator *(cnatural r, complex_iu l) {
00263 complex_iu x;
00264 x.q = r*l.q;
00265 return(x);
00266 };
00267 complex_iu operator /(complex_iu r, complex_iu l) {
00268 complex_iu x;
00269 x.q = r.q/l.q;
00270 return(x);
00271 };
00272 complex_iu operator /(cnatural r, complex_iu l) {
00273 complex_iu x;
00274 x.q = r/l.q;
00275 return(x);
00276 };
00277 complex_iu operator /(complex_iu r, cnatural l) {
00278 complex_iu x;
00279 x.q = r.q/l;
00280 return(x);
00281 };
00282 complex_iu operator /(complex_iu r, natural l) {
00283 complex_iu x;
00284 x.q = r.q/l;
00285 return(x);
00286 };
00287
00288 complex_iu operator <<(complex_iu r, const natural shift) {
00289 complex_iu x;
00290 x.q = r.q << shift;
00291 x.mask = r.mask << shift;
00292 x.bits = r.bits + shift;
00293 return(x);
00294 };
00295 complex_iu operator >>(complex_iu r, const natural shift) {
00296 complex_iu x;
00297 x.q = r.q >> shift;
00298 x.mask = r.mask >> shift;
00299 x.bits = r.bits - shift;
00300 return(x);
00301 };
00302 }
00303 #endif