C-XSC - A C++ Class Library for Extended Scientific Computing
2.5.4
|
00001 /* 00002 ** CXSC is a C++ library for eXtended Scientific Computing (V 2.5.4) 00003 ** 00004 ** Copyright (C) 1990-2000 Institut fuer Angewandte Mathematik, 00005 ** Universitaet Karlsruhe, Germany 00006 ** (C) 2000-2014 Wiss. Rechnen/Softwaretechnologie 00007 ** Universitaet Wuppertal, Germany 00008 ** 00009 ** This library is free software; you can redistribute it and/or 00010 ** modify it under the terms of the GNU Library General Public 00011 ** License as published by the Free Software Foundation; either 00012 ** version 2 of the License, or (at your option) any later version. 00013 ** 00014 ** This library is distributed in the hope that it will be useful, 00015 ** but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00017 ** Library General Public License for more details. 00018 ** 00019 ** You should have received a copy of the GNU Library General Public 00020 ** License along with this library; if not, write to the Free 00021 ** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00022 */ 00023 00024 /* CVS $Id: idot.inl,v 1.25 2014/01/30 17:23:45 cxsc Exp $ */ 00025 00026 namespace cxsc { 00027 00028 // ---- Konstruktoren ---- 00029 00030 inline idotprecision::idotprecision(const dotprecision &a,const dotprecision &b) throw(ERROR_IDOTPRECISION_EMPTY_INTERVAL) 00031 : inf(a), sup(b), k(0) 00032 { 00033 if(a>b) 00034 cxscthrow(ERROR_IDOTPRECISION_EMPTY_INTERVAL("inline idotprecision::idotprecision(const dotprecision &a,const dotprecision &b)")); 00035 inf.set_k(0); 00036 sup.set_k(0); 00037 } 00038 00039 inline idotprecision::idotprecision(const idotprecision &a) 00040 : inf(a.inf), sup(a.sup), k(a.k) 00041 { 00042 // if (a > b) errmon (ERR_INTERVAL(EMPTY)); throw! 00043 } 00044 00045 // ---- Typwandlungen ---- 00051 inline idotprecision _idotprecision(const real & a) 00052 { 00053 return idotprecision (a,a); 00054 } 00060 inline idotprecision _idotprecision(const real & a, const real & b) 00061 { 00062 return idotprecision (a,b); 00063 } 00069 inline idotprecision _unchecked_idotprecision(const real & a, const real & b) { 00070 idotprecision tmp; 00071 tmp.inf = a; 00072 tmp.sup = b; 00073 return tmp; 00074 } 00075 00081 inline idotprecision _idotprecision(const dotprecision & a) 00082 { 00083 return idotprecision (a,a); 00084 } 00090 inline idotprecision _idotprecision(const dotprecision & a, const dotprecision & b) 00091 { 00092 return idotprecision (a,b); 00093 } 00099 inline idotprecision _unchecked_idotprecision(const dotprecision & a, const dotprecision & b) { 00100 idotprecision tmp; 00101 tmp.inf = a; 00102 tmp.sup = b; 00103 return tmp; 00104 } 00105 00106 00107 // ---- Standardfunkt ---- (arithmetische Operatoren) 00108 00109 inline idotprecision operator-(const idotprecision &a) throw() { return idotprecision (-a.sup, -a.inf); } 00110 inline idotprecision operator+(const idotprecision &a) throw() { return a; } 00111 00112 inline idotprecision operator+(const idotprecision &a,const idotprecision &b) throw() { return idotprecision(a.inf+b.inf,a.sup+b.sup); } 00113 inline idotprecision operator-(const idotprecision &a,const idotprecision &b) throw() { return idotprecision(a.inf-b.sup,a.sup-b.inf); } 00114 inline idotprecision operator |(const idotprecision &a,const idotprecision &b) throw() 00115 { 00116 return idotprecision((a.inf<b.inf)?a.inf:b.inf,(a.sup>b.sup)?a.sup:b.sup); 00117 } 00118 // ID-D 00119 00120 inline idotprecision operator +(const idotprecision &a,const dotprecision &b) throw() { return idotprecision(a.inf+b,a.sup+b); } 00121 inline idotprecision operator +(const dotprecision &b,const idotprecision &a) throw() { return idotprecision(a.inf+b,a.sup+b); } 00122 inline idotprecision operator -(const idotprecision &a,const dotprecision &b) throw() { return idotprecision(a.inf-b,a.sup-b); } 00123 inline idotprecision operator -(const dotprecision &a,const idotprecision &b) throw() { return idotprecision(a-b.sup,a-b.inf); } 00124 00125 inline idotprecision operator |(const dotprecision &a,const idotprecision &b) throw() 00126 { 00127 return idotprecision((a<b.inf)?a:b.inf,(a>b.sup)?a:b.sup); 00128 } 00129 inline idotprecision operator |(const idotprecision &a,const dotprecision &b) throw() 00130 { 00131 return idotprecision((a.inf<b)?a.inf:b,(a.sup>b)?a.sup:b); 00132 } 00133 inline idotprecision operator |(const dotprecision &a,const dotprecision &b) throw() 00134 { 00135 if(a>b) return idotprecision(b,a); 00136 else return idotprecision(a,b); 00137 } 00138 inline idotprecision operator &(const dotprecision &a,const idotprecision &b) throw(ERROR_IDOTPRECISION_EMPTY_INTERVAL) 00139 { 00140 return idotprecision((a>b.inf)?a:b.inf,(a<b.sup)?a:b.sup); 00141 } 00142 inline idotprecision operator &(const idotprecision &a,const dotprecision &b) throw(ERROR_IDOTPRECISION_EMPTY_INTERVAL) 00143 { 00144 return idotprecision((a.inf>b)?a.inf:b,(a.sup<b)?a.sup:b); 00145 } 00146 00147 // ID-L 00148 00149 inline idotprecision operator +(const idotprecision &a,const long &b) throw() { return idotprecision(a.inf+b,a.sup+b); } 00150 inline idotprecision operator +(const long &b,const idotprecision &a) throw() { return idotprecision(a.inf+b,a.sup+b); } 00151 inline idotprecision operator -(const idotprecision &a,const long &b) throw() { return idotprecision(a.inf-b,a.sup-b); } 00152 inline idotprecision operator -(const long &a,const idotprecision &b) throw() { return idotprecision(a-b.sup,a-b.inf); } 00153 00154 inline idotprecision operator |(const long &a,const idotprecision &b) throw() 00155 { 00156 return idotprecision((a<b.inf)?dotprecision(a):b.inf,(a>b.sup)?dotprecision(a):b.sup); 00157 } 00158 inline idotprecision operator |(const idotprecision &a,const long &b) throw() 00159 { 00160 return idotprecision((a.inf<b)?a.inf:dotprecision(b),(a.sup>b)?a.sup:dotprecision(b)); 00161 } 00162 inline idotprecision operator &(const idotprecision &a,const idotprecision &b) throw(ERROR_IDOTPRECISION_EMPTY_INTERVAL) 00163 { 00164 return idotprecision((a.inf>b.inf)?a.inf:b.inf,(a.sup<b.sup)?a.sup:b.sup); 00165 } 00166 inline idotprecision operator &(const long &a,const idotprecision &b) throw(ERROR_IDOTPRECISION_EMPTY_INTERVAL) 00167 { 00168 return idotprecision((a>b.inf)?dotprecision(a):b.inf,(a<b.sup)?dotprecision(a):b.sup); 00169 } 00170 inline idotprecision operator &(const idotprecision &a,const long &b) throw(ERROR_IDOTPRECISION_EMPTY_INTERVAL) 00171 { 00172 return idotprecision((a.inf>b)?a.inf:dotprecision(b),(a.sup<b)?a.sup:dotprecision(b)); 00173 } 00174 00175 // ID-R 00176 00177 inline idotprecision operator +(const idotprecision &a,const real &b) throw() { return idotprecision(a.inf+b,a.sup+b); } 00178 inline idotprecision operator +(const real &b,const idotprecision &a) throw() { return idotprecision(a.inf+b,a.sup+b); } 00179 inline idotprecision operator -(const idotprecision &a,const real &b) throw() { return idotprecision(a.inf-b,a.sup-b); } 00180 inline idotprecision operator -(const real &a,const idotprecision &b) throw() { return idotprecision(a-b.sup,a-b.inf); } 00181 00182 inline idotprecision operator |(const real &a,const idotprecision &b) throw() 00183 { 00184 return idotprecision((a<b.inf)?dotprecision(a):b.inf,(a>b.sup)?dotprecision(a):b.sup); 00185 } 00186 inline idotprecision operator |(const idotprecision &a,const real &b) throw() 00187 { 00188 return idotprecision((a.inf<b)?a.inf:dotprecision(b),(a.sup>b)?a.sup:dotprecision(b)); 00189 } 00190 inline idotprecision operator &(const real &a,const idotprecision &b) throw(ERROR_IDOTPRECISION_EMPTY_INTERVAL) 00191 { 00192 return idotprecision((a>b.inf)?dotprecision(a):b.inf,(a<b.sup)?dotprecision(a):b.sup); 00193 } 00194 inline idotprecision operator &(const idotprecision &a,const real &b) throw(ERROR_IDOTPRECISION_EMPTY_INTERVAL) 00195 { 00196 return idotprecision((a.inf>b)?a.inf:dotprecision(b),(a.sup<b)?a.sup:dotprecision(b)); 00197 } 00198 00199 00200 // ID-I 00201 00202 inline idotprecision operator +(const idotprecision &a,const interval &b) throw() { return idotprecision(a.inf+b.inf,a.sup+b.sup); } 00203 inline idotprecision operator +(const interval &b,const idotprecision &a) throw() { return idotprecision(a.inf+b.inf,a.sup+b.sup); } 00204 inline idotprecision operator -(const idotprecision &a,const interval &b) throw() { return idotprecision(a.inf-b.sup,a.sup-b.inf); } 00205 inline idotprecision operator -(const interval &a,const idotprecision &b) throw() { return idotprecision(a.inf-b.sup,a.sup-b.inf); } 00206 00207 inline idotprecision operator |(const interval &a,const idotprecision &b) throw() 00208 { 00209 return idotprecision((a.inf<b.inf)?dotprecision(a.inf):b.inf,(a.sup>b.sup)?dotprecision(a.sup):b.sup); 00210 } 00211 inline idotprecision operator |(const idotprecision &a,const interval &b) throw() 00212 { 00213 return idotprecision((a.inf<b.inf)?a.inf:dotprecision(b.inf),(a.sup>b.sup)?a.sup:dotprecision(b.sup)); 00214 } 00215 inline idotprecision operator &(const interval &a,const idotprecision &b) throw(ERROR_IDOTPRECISION_EMPTY_INTERVAL) 00216 { 00217 return idotprecision((a.inf>b.inf)?dotprecision(a.inf):b.inf,(a.sup<b.sup)?dotprecision(a.sup):b.sup); 00218 } 00219 inline idotprecision operator &(const idotprecision &a,const interval &b) throw(ERROR_IDOTPRECISION_EMPTY_INTERVAL) 00220 { 00221 return idotprecision((a.inf>b.inf)?a.inf:dotprecision(b.inf),(a.sup<b.sup)?a.sup:dotprecision(b.sup)); 00222 } 00223 00224 // D-R 00225 00226 inline idotprecision operator |(const dotprecision &a,const real &b) throw() 00227 { 00228 if(a<b) 00229 return idotprecision(a,dotprecision(b)); 00230 return idotprecision(dotprecision(b),a); 00231 } 00232 inline idotprecision operator |(const real &b,const dotprecision &a) throw() 00233 { 00234 if(a<b) 00235 return idotprecision(a,dotprecision(b)); 00236 return idotprecision(dotprecision(b),a); 00237 } 00238 00239 00240 00241 inline idotprecision & operator +=(idotprecision &a,const idotprecision &b) throw() { a.inf+=b.inf,a.sup+=b.sup; return a;} 00242 inline idotprecision & operator +=(idotprecision &a,const dotprecision &b) throw() { a.inf+=b,a.sup+=b; return a;} 00243 inline idotprecision & operator -=(idotprecision &a,const idotprecision &b) throw() { a.inf-=b.inf,a.sup-=b.sup; return a;} 00244 inline idotprecision & operator -=(idotprecision &a,const dotprecision &b) throw() { a.inf-=b,a.sup-=b; return a;} 00245 inline idotprecision & operator +=(idotprecision &a,const interval &b) throw() 00246 { 00247 a.inf+=Inf(b); 00248 a.sup+=Sup(b); 00249 return a; 00250 } 00251 inline idotprecision & operator -=(idotprecision &a,const interval &b) throw() 00252 { 00253 a.inf-=Sup(b); 00254 a.sup-=Inf(b); 00255 return a; 00256 } 00257 inline idotprecision & operator +=(idotprecision &a,const real &b) throw() 00258 { 00259 a.inf+=b; 00260 a.sup+=b; 00261 return a; 00262 } 00263 inline idotprecision & operator -=(idotprecision &a,const real &b) throw() 00264 { 00265 a.inf-=b; 00266 a.sup-=b; 00267 return a; 00268 } 00269 00270 00271 inline idotprecision & operator |=(idotprecision &a,const idotprecision &b) throw() 00272 { 00273 if(b.inf<a.inf) 00274 a.inf=b.inf; 00275 if(b.sup>a.sup) 00276 a.sup=b.sup; 00277 return a; 00278 } 00279 inline idotprecision & operator &=(idotprecision &a,const idotprecision &b) throw(ERROR_IDOTPRECISION_EMPTY_INTERVAL) 00280 { 00281 if(b.inf>a.inf) 00282 a.inf=b.inf; 00283 if(b.sup<a.sup) 00284 a.sup=b.sup; 00285 00286 if(a.inf>a.sup) 00287 cxscthrow(ERROR_IDOTPRECISION_EMPTY_INTERVAL("inline idotprecision & operator &=(idotprecision &a,const idotprecision &b)")); 00288 return a; 00289 } 00290 inline idotprecision & operator |=(idotprecision &a,const dotprecision &b) throw() 00291 { 00292 if(b<a.inf) 00293 a.inf=b; 00294 if(b>a.sup) 00295 a.sup=b; 00296 return a; 00297 } 00298 inline idotprecision & operator &=(idotprecision &a,const dotprecision &b) throw(ERROR_IDOTPRECISION_EMPTY_INTERVAL) 00299 { 00300 if(b>a.inf) 00301 a.inf=b; 00302 if(b<a.sup) 00303 a.sup=b; 00304 if(a.inf>a.sup) 00305 cxscthrow(ERROR_IDOTPRECISION_EMPTY_INTERVAL("inline idotprecision & operator &=(idotprecision &a,const dotprecision &b)")); 00306 return a; 00307 } 00308 00309 // --- Vergleichsoperationen ---- 00310 inline bool operator ==(const idotprecision &a,const idotprecision &b) throw() { return(a.inf==b.inf && a.sup==b.sup); } 00311 inline bool operator !=(const idotprecision &a,const idotprecision &b) throw() { return(a.inf!=b.inf || a.sup!=b.sup); } 00312 inline bool operator ==(const dotprecision &r,const idotprecision &a) throw() { return(r==a.inf && r==a.sup); } 00313 inline bool operator !=(const dotprecision &r,const idotprecision &a) throw() { return(r!=a.inf || r!=a.sup); } 00314 inline bool operator ==(const idotprecision &a,const dotprecision &r) throw() { return(r==a.inf && r==a.sup); } 00315 inline bool operator !=(const idotprecision &a,const dotprecision &r) throw() { return(r!=a.inf || r!=a.sup); } 00316 00317 inline bool operator ==(const real &r,const idotprecision &a) throw() { return(r==a.inf && r==a.sup); } 00318 inline bool operator !=(const real &r,const idotprecision &a) throw() { return(r!=a.inf || r!=a.sup); } 00319 inline bool operator ==(const idotprecision &a,const real &r) throw() { return(r==a.inf && r==a.sup); } 00320 inline bool operator !=(const idotprecision &a,const real &r) throw() { return(r!=a.inf || r!=a.sup); } 00321 00322 inline bool operator ==(const interval &a,const idotprecision &b) throw() { return(Inf(a)==b.inf && Sup(a)==b.sup); } 00323 inline bool operator !=(const interval &a,const idotprecision &b) throw() { return(Inf(a)!=b.inf || Sup(a)!=b.sup); } 00324 inline bool operator ==(const idotprecision &a,const interval &b) throw() { return(a.inf==Inf(b) && a.sup==Sup(b)); } 00325 inline bool operator !=(const idotprecision &a,const interval &b) throw() { return(a.inf!=Inf(b) || a.sup!=Sup(b)); } 00326 00327 // --- Mengenvergleiche --- 00328 // <,>,... 00329 inline bool operator <=(const idotprecision &a,const idotprecision &b) throw() 00330 { 00331 return(a.inf>=b.inf && a.sup<=b.sup); 00332 } 00333 inline bool operator >=(const idotprecision &a,const idotprecision &b) throw() 00334 { 00335 return(a.inf<=b.inf && a.sup>=b.sup); 00336 } 00337 inline bool operator <(const idotprecision &a,const idotprecision &b) throw() 00338 { 00339 return(a.inf>b.inf && a.sup<b.sup); 00340 } 00341 inline bool operator >(const idotprecision &a,const idotprecision &b) throw() 00342 { 00343 return(a.inf<b.inf && a.sup>b.sup); 00344 } 00345 00346 inline bool operator <=(const dotprecision &a,const idotprecision &b) throw() 00347 { 00348 return(a>=b.inf && a<=b.sup); 00349 } 00350 inline bool operator >=(const dotprecision &a,const idotprecision &b) throw() 00351 { 00352 return(a<=b.inf && a>=b.sup); 00353 } 00354 inline bool operator <(const dotprecision &a,const idotprecision &b) throw() 00355 { 00356 return(a>b.inf && a<b.sup); 00357 } 00358 00359 inline bool operator <=(const idotprecision &a,const dotprecision &b) throw() 00360 { 00361 return(a.inf>=b && a.sup<=b); 00362 } 00363 inline bool operator >=(const idotprecision &a,const dotprecision &b) throw() 00364 { 00365 return(a.inf<=b && a.sup>=b); 00366 } 00367 inline bool operator >(const idotprecision &a,const dotprecision &b) throw() 00368 { 00369 return(a.inf<b && a.sup>b); 00370 } 00371 00372 inline bool operator <=(const real &a,const idotprecision &b) throw() 00373 { 00374 return(a>=b.inf && a<=b.sup); 00375 } 00376 inline bool operator >=(const real &a,const idotprecision &b) throw() 00377 { 00378 return(a<=b.inf && a>=b.sup); 00379 } 00380 inline bool operator <(const real &a,const idotprecision &b) throw() 00381 { 00382 return(a>b.inf && a<b.sup); 00383 } 00384 00385 inline bool operator <=(const idotprecision &a,const real &b) throw() 00386 { 00387 return(a.inf>=b && a.sup<=b); 00388 } 00389 inline bool operator >=(const idotprecision &a,const real &b) throw() 00390 { 00391 return(a.inf<=b && a.sup>=b); 00392 } 00393 inline bool operator >(const idotprecision &a,const real &b) throw() 00394 { 00395 return(a.inf<b && a.sup>b); 00396 } 00397 00398 inline bool operator <=(const interval &a,const idotprecision &b) throw() 00399 { 00400 return(Inf(a)>=b.inf && Sup(a)<=b.sup); 00401 } 00402 inline bool operator >=(const interval &a,const idotprecision &b) throw() 00403 { 00404 return(Inf(a)<=b.inf && Sup(a)>=b.sup); 00405 } 00406 inline bool operator <(const interval &a,const idotprecision &b) throw() 00407 { 00408 return(Inf(a)>b.inf && Sup(a)<b.sup); 00409 } 00410 inline bool operator >(const interval &a,const idotprecision &b) throw() 00411 { 00412 return(Inf(a)<b.inf && Sup(a)>b.sup); 00413 } 00414 00415 inline bool operator <=(const idotprecision &a,const interval &b) throw() 00416 { 00417 return(a.inf>=Inf(b) && a.sup<=Sup(b)); 00418 } 00419 inline bool operator >=(const idotprecision &a,const interval &b) throw() 00420 { 00421 return(a.inf<=Inf(b) && a.sup>=Sup(b)); 00422 } 00423 inline bool operator <(const idotprecision &a,const interval &b) throw() 00424 { 00425 return(a.inf>Inf(b) && a.sup<Sup(b)); 00426 } 00427 inline bool operator >(const idotprecision &a,const interval &b) throw() 00428 { 00429 return(a.inf<Inf(b) && a.sup>Sup(b)); 00430 } 00431 00432 // ----- Funktionen ----- 00433 00434 inline idotprecision & SetInf (idotprecision & a, const dotprecision & b) throw() 00435 { // ggf. exception 00436 a.inf=b; 00437 return a; 00438 } 00439 inline idotprecision & SetSup (idotprecision & a, const dotprecision & b) throw() 00440 { 00441 a.sup=b; 00442 return a; 00443 } 00444 inline idotprecision & SetInf (idotprecision & a, const real & b) throw() 00445 { // ggf. exception 00446 a.inf=b; 00447 return a; 00448 } 00449 inline idotprecision & SetSup (idotprecision & a, const real & b) throw() 00450 { 00451 a.sup=b; 00452 return a; 00453 } 00454 inline idotprecision & UncheckedSetInf (idotprecision & a, const dotprecision & b) throw() 00455 { 00456 a.inf=b; 00457 return a; 00458 } 00459 inline idotprecision & UncheckedSetSup (idotprecision & a, const dotprecision & b) throw() 00460 { 00461 a.sup=b; 00462 return a; 00463 } 00464 inline idotprecision & UncheckedSetInf (idotprecision & a, const real & b) throw() 00465 { 00466 a.inf=b; 00467 return a; 00468 } 00469 inline idotprecision & UncheckedSetSup (idotprecision & a, const real & b) throw() 00470 { 00471 a.sup=b; 00472 return a; 00473 } 00474 00475 inline bool operator !(const idotprecision &a) throw() { return (a.inf <= dotprecision(0.0) && a.sup >= dotprecision(0.0)); } 00476 00477 inline bool IsEmpty(const idotprecision &a) throw() { return (a.inf>a.sup); } 00478 00479 inline idotprecision abs(const idotprecision &a) throw() 00480 { 00481 dotprecision h1 = abs(a.inf); 00482 dotprecision h2 = abs(a.sup); 00483 00484 if (IsEmpty(a)) return a; 00485 if (!a) 00486 return idotprecision(dotprecision(0.0), (h1 > h2) ? h1 : h2); 00487 if (h1 > h2) 00488 return idotprecision(h2, h1); 00489 00490 return idotprecision(h1, h2); 00491 } 00492 00493 inline void accumulate (idotprecision & a, const interval & b, const real & c) throw() { accumulate(a,b,_interval(c)); } 00494 inline void accumulate (idotprecision & a, const real & b, const interval & c) throw() { accumulate(a,_interval(b),c); } 00495 inline void accumulate (idotprecision & a, const real & b, const real & c) throw() { accumulate(a,_interval(b),_interval(c)); } 00496 00497 } // namespace cxsc 00498