00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef _CXSC_LX_COMPLEX_HPP_INCLUDED
00040 #define _CXSC_LX_COMPLEX_HPP_INCLUDED
00041
00042 #include <iostream>
00043 #include <except.hpp>
00044 #include <l_cinterval.hpp>
00045 #include <l_complex.hpp>
00046 #include "lx_interval.hpp"
00047
00048 namespace cxsc {
00049
00050
00051
00052
00053 class lx_complex
00054 {
00055 private:
00056
00057 lx_real re;
00058 lx_real im;
00059
00060 public:
00061
00062
00064 lx_complex(void) throw() {}
00066 lx_complex(const real& nr, const l_real &ar, const real& ni, const l_real &ai)
00067 throw() : re(lx_real(nr,ar)), im(lx_real(ni,ai)) { }
00069 lx_complex(const real& n, const real &a)
00070 throw() : re(lx_real(n,a)), im(lx_real(0.0)) { }
00072 lx_complex(const lx_real &a, const lx_real &b)
00073 throw() : re(a), im(b) { }
00075 lx_complex(const lx_real &a) throw() : re(a), im(lx_real(0.0)) { }
00077 explicit lx_complex(const l_real &a, const l_real &b)
00078 throw() : re(a), im(b) { }
00080 explicit lx_complex(const l_real &a)
00081 throw() : re(a), im(lx_real(0.0)) { }
00083 explicit lx_complex(const real &a)
00084 throw() : re(a), im(lx_real(0.0)) { }
00086 explicit lx_complex(const complex &a)
00087 throw() : re(Re(a)), im(Im(a)) { }
00089 explicit lx_complex(const l_complex &a)
00090 throw() : re(lx_real(0,Re(a))), im(lx_real(0,Im(a))) { }
00092 lx_complex(const real& pr, const string& sr,
00093 const real& pi, const string& si)
00094 throw() : re(lx_real(pr,sr)), im(lx_real(pi,si)) { }
00095
00096
00098 lx_complex & operator = (const lx_real & lr) throw()
00099 { re = lr; im = 0; return *this; }
00101 lx_complex & operator = (const l_real & lr) throw()
00102 { re = lr; im = 0; return *this; }
00104 lx_complex & operator = (const real & lr) throw()
00105 { re = lr; im = 0; return *this; }
00107 lx_complex & operator = (const l_complex & c) throw()
00108 { re = Re(c); im = Im(c); return *this; }
00110 lx_complex & operator = (const complex & c) throw()
00111 { re = Re(c); im = Im(c); return *this; }
00112
00113
00114
00116 friend inline lx_real Re(const lx_complex&);
00118 friend inline lx_real Im(const lx_complex&);
00120 friend inline int StagPrec(const lx_complex&) throw();
00122 friend inline real expoRe(const lx_complex&) throw();
00124 friend inline real expoIm(const lx_complex&) throw();
00126 friend inline l_real lr_partRe(const lx_complex&) throw();
00128 friend inline l_real lr_partIm(const lx_complex&) throw();
00129
00131 friend inline lx_complex & SetRe(lx_complex&, const lx_real&);
00133 friend inline lx_complex & SetRe(lx_complex&, const l_real&);
00135 friend inline lx_complex & SetRe(lx_complex&, const real&);
00136
00138 friend inline lx_complex & SetIm(lx_complex&, const lx_real&);
00140 friend inline lx_complex & SetIm(lx_complex&, const l_real&);
00142 friend inline lx_complex & SetIm(lx_complex&, const real&);
00143
00145 friend inline lx_complex conj(const lx_complex& a) throw();
00147 friend lx_real abs (const lx_complex&) throw();
00149 friend lx_real abs2 (const lx_complex&) throw();
00150
00152 friend inline bool operator ! (const lx_complex& ) throw();
00153
00155 friend inline bool operator == (const lx_complex&, const lx_complex&)
00156 throw();
00158 friend inline bool operator == (const lx_complex&, const l_complex&)
00159 throw();
00161 friend inline bool operator == (const lx_complex&, const complex&)
00162 throw();
00164 friend inline bool operator == (const l_complex&, const lx_complex&)
00165 throw();
00167 friend inline bool operator == (const complex&, const lx_complex&)
00168 throw();
00170 friend inline bool operator == (const lx_complex&, const lx_real&) throw();
00172 friend inline bool operator == (const lx_complex&, const l_real&) throw();
00174 friend inline bool operator == (const lx_complex&, const real&) throw();
00176 friend inline bool operator == (const lx_real&, const lx_complex&) throw();
00178 friend inline bool operator == (const l_real&, const lx_complex&) throw();
00180 friend inline bool operator == (const real&, const lx_complex&) throw();
00181
00183 friend inline lx_complex operator - (const lx_complex &) throw();
00184
00185
00186
00187
00189 friend inline std::ostream& operator << (std::ostream& s, const lx_complex& a)
00190 throw();
00192 friend inline std::string & operator << (std::string &s, const lx_complex& a)
00193 throw();
00194
00195
00196
00197
00198
00200 friend std::string & operator >> (std::string& s, lx_complex& a) throw();
00201
00203 friend std::istream & operator >> (std::istream &s, lx_complex &a) throw()
00204
00205
00206 {
00207 char c;
00208 std::cout << "Real part: {Exponent to base 10, real number} = ?"
00209 << std::endl;
00210 s >> a.re;
00211 std::cout << "Img. part: {Exponent to base 10, real number} = ?"
00212 << std::endl;
00213 s >> a.im >> RestoreOpt;
00214
00215 if (!waseolnflag)
00216 {
00217 skipeolnflag = false, inpdotflag = true;
00218 c = skipwhitespaces (s);
00219 if (inpdotflag && c != ')')
00220 s.putback(c);
00221 }
00222 return s;
00223 }
00224
00226 friend inline lx_complex operator + (const lx_complex&, const lx_complex&)
00227 throw();
00229 friend inline lx_complex operator + (const lx_complex&, const lx_real&) throw();
00231 friend inline lx_complex operator + (const lx_real&, const lx_complex&) throw();
00233 friend inline lx_complex operator + (const lx_complex&, const l_real&) throw();
00235 friend inline lx_complex operator + (const l_real&, const lx_complex&) throw();
00237 friend inline lx_complex operator + (const lx_complex&, const real&) throw();
00239 friend inline lx_complex operator + (const real&, const lx_complex&) throw();
00240
00242 friend inline lx_complex operator * (const lx_complex&, const lx_complex&)
00243 throw();
00244
00246 friend inline lx_complex operator / (const lx_complex&, const lx_complex&)
00247 throw();
00248
00249 };
00250
00251
00252
00253
00254
00255 inline std::ostream& operator << (std::ostream& s, const lx_complex&)
00256 throw();
00257 inline std::string & operator << (std::string& s, const lx_complex&)
00258 throw();
00259
00260
00261
00262 inline lx_real Re(const lx_complex&);
00263 inline lx_real Im(const lx_complex&);
00264 inline int StagPrec(const lx_complex&) throw();
00265 inline real expoRe(const lx_complex&) throw();
00266 inline real expoIm(const lx_complex&) throw();
00267 inline l_real lr_partRe(const lx_complex&) throw();
00268 inline l_real lr_partIm(const lx_complex&) throw();
00269
00270 inline lx_complex & SetRe(lx_complex&, const lx_real&);
00271 inline lx_complex & SetRe(lx_complex&, const l_real&);
00272 inline lx_complex & SetRe(lx_complex&, const real&);
00273
00274 inline lx_complex & SetIm(lx_complex&, const lx_real&);
00275 inline lx_complex & SetIm(lx_complex&, const l_real&);
00276 inline lx_complex & SetIm(lx_complex&, const real&);
00277
00278 inline lx_complex conj(const lx_complex&) throw();
00279
00280 lx_real abs (const lx_complex&) throw();
00281 lx_real abs2 (const lx_complex&) throw();
00282
00283 inline bool operator == (const lx_complex&, const lx_complex&) throw();
00284
00285 inline bool operator == (const lx_complex&, const l_complex&) throw();
00286 inline bool operator == (const lx_complex&, const complex&) throw();
00287 inline bool operator == (const l_complex&, const lx_complex&) throw();
00288 inline bool operator == (const complex&, const lx_complex&) throw();
00289
00290 inline bool operator == (const lx_complex&, const lx_real&) throw();
00291 inline bool operator == (const lx_complex&, const l_real&) throw();
00292 inline bool operator == (const lx_complex&, const real&) throw();
00293 inline bool operator == (const lx_real&, const lx_complex&) throw();
00294 inline bool operator == (const l_real&, const lx_complex&) throw();
00295 inline bool operator == (const real&, const lx_complex&) throw();
00296
00297
00298
00300 inline bool operator != (const lx_complex&, const lx_complex&) throw();
00302 inline bool operator != (const lx_complex&, const l_complex&) throw();
00304 inline bool operator != (const lx_complex&, const complex&) throw();
00306 inline bool operator != (const l_complex&, const lx_complex&) throw();
00308 inline bool operator != (const complex&, const lx_complex&) throw();
00309
00311 inline bool operator != (const lx_complex&, const lx_real&) throw();
00313 inline bool operator != (const lx_complex&, const l_real&) throw();
00315 inline bool operator != (const lx_complex&, const real&) throw();
00317 inline bool operator != (const lx_real&, const lx_complex&) throw();
00319 inline bool operator != (const l_real&, const lx_complex&) throw();
00321 inline bool operator != (const real&, const lx_complex&) throw();
00322
00323 inline lx_complex operator - (const lx_complex &) throw();
00324
00325
00326
00327 inline std::ostream& operator << (std::ostream& s, const lx_complex& a)
00328 throw();
00329 inline std::string & operator << (std::string& s, const lx_complex& a)
00330 throw();
00331
00332
00333
00334
00335
00337 std::string & operator >> (std::string& s, lx_complex& a) throw();
00338
00339
00340
00341
00342
00344 void operator >> (const std::string &s, lx_complex &a) throw();
00346 void operator >> (const char *s, lx_complex& a) throw();
00347
00348
00349
00351 inline lx_complex operator + (const lx_complex&) throw();
00352
00354 inline lx_complex operator + (const lx_complex&, const l_complex&) throw();
00356 inline lx_complex operator + (const lx_complex&, const complex&) throw();
00358 inline lx_complex operator + (const l_complex&, const lx_complex&) throw();
00360 inline lx_complex operator + (const complex&, const lx_complex&) throw();
00362 inline lx_complex operator + (const lx_complex&, const lx_real&) throw();
00364 inline lx_complex operator + (const lx_real&, const lx_complex&) throw();
00366 inline lx_complex operator + (const lx_complex&, const l_real&) throw();
00368 inline lx_complex operator + (const l_real&, const lx_complex&) throw();
00370 inline lx_complex operator + (const lx_complex&, const real&) throw();
00372 inline lx_complex operator + (const real&, const lx_complex&) throw();
00373
00375 inline lx_complex & operator +=(lx_complex &, const lx_complex &) throw();
00377 inline lx_complex & operator +=(lx_complex &, const l_complex &) throw();
00379 inline lx_complex & operator +=(lx_complex &, const complex &) throw();
00381 inline lx_complex & operator +=(lx_complex &, const lx_real &) throw();
00383 inline lx_complex & operator +=(lx_complex &, const l_real &) throw();
00385 inline lx_complex & operator +=(lx_complex &, const real &) throw();
00386
00388 inline lx_complex operator - (const lx_complex&, const lx_complex&) throw();
00390 inline lx_complex operator - (const lx_complex&, const l_complex&) throw();
00392 inline lx_complex operator - (const lx_complex&, const complex&) throw();
00394 inline lx_complex operator - (const l_complex&, const lx_complex&) throw();
00396 inline lx_complex operator - (const complex&, const lx_complex&) throw();
00398 inline lx_complex operator - (const lx_complex&, const lx_real&) throw();
00400 inline lx_complex operator - (const lx_complex&, const l_real&) throw();
00402 inline lx_complex operator - (const lx_complex&, const real&) throw();
00404 inline lx_complex operator - (const lx_real&, const lx_complex&) throw();
00406 inline lx_complex operator - (const l_real&, const lx_complex&) throw();
00408 inline lx_complex operator - (const real&, const lx_complex&) throw();
00409
00411 inline lx_complex & operator -=(lx_complex &, const lx_complex &) throw();
00413 inline lx_complex & operator -=(lx_complex &, const l_complex &) throw();
00415 inline lx_complex & operator -=(lx_complex &, const complex &) throw();
00417 inline lx_complex & operator -=(lx_complex &, const lx_real &) throw();
00419 inline lx_complex & operator -=(lx_complex &, const l_real &) throw();
00421 inline lx_complex & operator -=(lx_complex &, const real &) throw();
00422
00424 inline lx_complex operator * (const lx_complex&, const lx_complex&) throw();
00426 inline lx_complex operator * (const lx_complex&, const l_complex&) throw();
00428 inline lx_complex operator * (const lx_complex&, const complex&) throw();
00430 inline lx_complex operator * (const l_complex&, const lx_complex&) throw();
00432 inline lx_complex operator * (const complex&, const lx_complex&) throw();
00434 inline lx_complex operator * (const lx_complex&, const lx_real&) throw();
00436 inline lx_complex operator * (const lx_complex&, const l_real&) throw();
00438 inline lx_complex operator * (const lx_complex&, const real&) throw();
00440 inline lx_complex operator * (const lx_real&, const lx_complex&) throw();
00442 inline lx_complex operator * (const l_real&, const lx_complex&) throw();
00444 inline lx_complex operator * (const real&, const lx_complex&) throw();
00445
00447 inline lx_complex & operator *=(lx_complex &, const lx_complex &) throw();
00449 inline lx_complex & operator *=(lx_complex &, const l_complex &) throw();
00451 inline lx_complex & operator *=(lx_complex &, const complex &) throw();
00453 inline lx_complex & operator *=(lx_complex &, const lx_real &) throw();
00455 inline lx_complex & operator *=(lx_complex &, const l_real &) throw();
00457 inline lx_complex & operator *=(lx_complex &, const real &) throw();
00458
00460 inline lx_complex operator / (const lx_complex&, const lx_complex&) throw();
00462 inline lx_complex operator / (const lx_complex&, const l_complex&) throw();
00464 inline lx_complex operator / (const lx_complex&, const complex&) throw();
00466 inline lx_complex operator / (const l_complex&, const lx_complex&) throw();
00468 inline lx_complex operator / (const complex&, const lx_complex&) throw();
00470 inline lx_complex operator / (const lx_complex&, const lx_real&) throw();
00472 inline lx_complex operator / (const lx_complex&, const l_real&) throw();
00474 inline lx_complex operator / (const lx_complex&, const real&) throw();
00476 inline lx_complex operator / (const lx_real&, const lx_complex&) throw();
00478 inline lx_complex operator / (const l_real&, const lx_complex&) throw();
00480 inline lx_complex operator / (const real&, const lx_complex&) throw();
00481
00483 inline lx_complex & operator /=(lx_complex &, const lx_complex &) throw();
00485 inline lx_complex & operator /=(lx_complex &, const l_complex &) throw();
00487 inline lx_complex & operator /=(lx_complex &, const complex &) throw();
00489 inline lx_complex & operator /=(lx_complex &, const lx_real &) throw();
00491 inline lx_complex & operator /=(lx_complex &, const l_real &) throw();
00493 inline lx_complex & operator /=(lx_complex &, const real &) throw();
00494
00495
00496
00497
00498
00499
00500
00502 lx_complex sqr(const lx_complex&) throw();
00504 lx_complex sqrt(const lx_complex&) throw();
00506 lx_complex sqrt(const lx_complex& ,int) throw();
00508 lx_complex exp(const lx_complex&) throw();
00510 lx_complex exp2(const lx_complex&) throw();
00512 lx_complex exp10(const lx_complex&) throw();
00514 lx_complex sin(const lx_complex&) throw();
00516 lx_complex cos(const lx_complex&) throw();
00518 lx_complex tan(const lx_complex&) throw();
00520 lx_complex cot(const lx_complex&) throw();
00522 lx_complex asin(const lx_complex&) throw();
00524 lx_complex acos(const lx_complex&) throw();
00526 lx_complex atan(const lx_complex&) throw();
00528 lx_complex acot(const lx_complex&) throw();
00530 lx_complex sinh(const lx_complex&) throw();
00532 lx_complex cosh(const lx_complex&) throw();
00534 lx_complex tanh(const lx_complex&) throw();
00536 lx_complex coth(const lx_complex&) throw();
00538 lx_complex asinh(const lx_complex&) throw();
00540 lx_complex acosh(const lx_complex&) throw();
00542 lx_complex atanh(const lx_complex&) throw();
00544 lx_complex acoth(const lx_complex&) throw();
00546 std::list<lx_complex>sqrt_all(const lx_complex&);
00548 lx_real arg(const lx_complex&) throw();
00550 lx_real Arg(const lx_complex&) throw();
00552 std::list<lx_complex>sqrt_all(const lx_complex&, int);
00554 lx_complex ln(const lx_complex&) throw();
00556 lx_complex log2(const lx_complex&) throw();
00558 lx_complex log10(const lx_complex&) throw();
00560 lx_complex power_fast(const lx_complex&, const real&) throw();
00562 lx_complex power(const lx_complex&, const real&) throw();
00564 lx_complex pow(const lx_complex&, const lx_real&) throw();
00566 lx_complex pow(const lx_complex&, const lx_complex&) throw();
00567
00569 lx_complex sqrt1px2(const lx_complex&) throw();
00571 lx_complex sqrt1mx2(const lx_complex&) throw();
00573 lx_complex sqrtx2m1(const lx_complex&) throw();
00575 lx_complex sqrtp1m1(const lx_complex&) throw();
00577 lx_complex expm1(const lx_complex&) throw();
00579 lx_complex lnp1(const lx_complex&) throw();
00580
00581 }
00582
00583 #include "lx_complex.inl"
00584
00585 #endif // _CXSC_LX_COMPLEX_HPP_INCLUDED