C-XSC - A C++ Class Library for Extended Scientific Computing  2.5.4
cinterval.hpp
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: cinterval.hpp,v 1.24 2014/01/30 17:23:44 cxsc Exp $ */
00025 
00026 #ifndef _CXSC_CINTERVAL_HPP_INCLUDED
00027 #define _CXSC_CINTERVAL_HPP_INCLUDED
00028 
00029 #include <iostream>
00030 #include <string>
00031 
00032 // Headerfile for cinterval.
00033 
00034 #include "except.hpp"
00035 #include "real.hpp"
00036 #include "complex.hpp"
00037 #include "interval.hpp"
00038 
00039 namespace cxsc {
00040 
00041 class civector;
00042 class cimatrix;
00043 class civector_slice;
00044 class cimatrix_slice;
00045 
00047 
00054 class cinterval
00055 {
00056    private:
00057       // ---- private data ----------------------------------------
00058       interval  re;
00059       interval  im;
00060 
00061    public:
00062       // ---- implicit constructors  ------------------------------
00064       inline cinterval(void)  throw ()           {}
00066       inline cinterval(const interval & a,const interval &b) throw(); 
00068       inline cinterval(const complex & a,const complex & b)  throw(ERROR_CINTERVAL_EMPTY_INTERVAL); 
00069 
00070       // The following are defined in the specific vector, matrix-files
00071 #if(CXSC_INDEX_CHECK) 
00072 
00073       INLINE cinterval(const civector &)       throw (ERROR_CIVECTOR_TYPE_CAST_OF_THICK_OBJ,ERROR_CIVECTOR_USE_OF_UNINITIALIZED_OBJ);
00075       INLINE cinterval(const civector_slice &) throw (ERROR_CIVECTOR_TYPE_CAST_OF_THICK_OBJ,ERROR_CIVECTOR_USE_OF_UNINITIALIZED_OBJ);
00077       INLINE cinterval(const cimatrix &)       throw (ERROR_CIMATRIX_TYPE_CAST_OF_THICK_OBJ,ERROR_CIMATRIX_USE_OF_UNINITIALIZED_OBJ);
00079       INLINE cinterval(const cimatrix_slice &) throw (ERROR_CIMATRIX_TYPE_CAST_OF_THICK_OBJ,ERROR_CIMATRIX_USE_OF_UNINITIALIZED_OBJ);
00080 #else
00081 
00082       INLINE cinterval(const civector &)       throw ();
00084       INLINE cinterval(const civector_slice &) throw ();
00086       INLINE cinterval(const cimatrix &)       throw ();
00088       INLINE cinterval(const cimatrix_slice &) throw ();
00089 #endif
00090       // ---- explicit constructors -------------------------------
00091 
00093       explicit inline cinterval(const real     & a)  throw();
00095       explicit inline cinterval(const interval & a)  throw();
00097       explicit inline cinterval(const complex  & a)  throw(); 
00099       explicit        cinterval(const dotprecision &)  throw();
00101       explicit        cinterval(const cdotprecision &) throw();
00103       explicit        cinterval(const idotprecision &) throw();
00105       explicit        cinterval(const cidotprecision &) throw();
00107       explicit        cinterval(const l_cinterval&) throw();
00108 
00109       // ---- assignments -----------------------------------------
00110 
00112       inline cinterval & operator =(const real &) throw();
00114       inline cinterval & operator =(const interval &) throw();
00116       inline cinterval & operator =(const complex &) throw();
00118       inline cinterval & operator =(const cinterval &) throw();
00119       
00121       inline cinterval & operator =(const dotprecision &) throw();
00123       inline cinterval & operator =(const idotprecision &) throw();
00125       inline cinterval & operator =(const cdotprecision &) throw();
00127       inline cinterval & operator =(const cidotprecision &) throw();
00129              cinterval & operator = (const l_cinterval&) throw();      
00131              cinterval & operator = (const lx_cinterval&) throw();
00132 
00133       // ---- compatiblility typecasts ----------------------------
00134 
00136       friend inline cinterval _cinterval(const real &) throw ();
00138       friend inline cinterval _cinterval(const interval &) throw();
00140       friend inline cinterval _cinterval(const complex &) throw ();
00142       friend inline cinterval _cinterval(const dotprecision &) throw();
00144       friend inline cinterval _cinterval(const idotprecision &) throw();
00146       friend inline cinterval _cinterval(const cdotprecision &) throw();
00148       friend inline cinterval _cinterval(const cidotprecision &) throw();
00149       
00151       friend inline cinterval _cinterval(const interval &,const interval &) throw();
00153       friend inline cinterval _cinterval(const real &,const interval &) throw();
00155       friend inline cinterval _cinterval(const interval &,const real &) throw();
00157       friend inline cinterval _cinterval(const complex &,const complex &) throw();
00159       friend inline cinterval _cinterval(const real &,const complex &) throw();
00161       friend inline cinterval _cinterval(const complex &,const real &) throw();
00163       friend inline cinterval _unchecked_cinterval(const complex &,const complex &) throw();
00165       friend inline cinterval _unchecked_cinterval(const real &,const complex &) throw();
00167       friend inline cinterval _unchecked_cinterval(const complex &,const real &) throw();
00168 
00169       // ---- Input/Output  ---------------------------------------
00170 
00172       friend std::ostream & operator <<(std::ostream &,const cinterval &) throw();
00174       friend std::istream & operator >>(std::istream &,cinterval &)       throw(ERROR_CINTERVAL_EMPTY_INTERVAL);
00176       friend std::string &  operator <<(std::string &,const cinterval &)  throw();
00178       friend std::string &  operator >>(std::string &,cinterval &)        throw(ERROR_CINTERVAL_EMPTY_INTERVAL);
00180       friend void           operator >>(const char *,cinterval &)         throw(ERROR_CINTERVAL_EMPTY_INTERVAL);
00182       friend void           operator >>(const std::string &,cinterval &)  throw(ERROR_CINTERVAL_EMPTY_INTERVAL);
00183 
00184       // ---- Std.Operators ---------------------------------------
00185 
00187       friend inline cinterval operator -(const cinterval &) throw ();
00189       friend inline cinterval operator +(const cinterval &) throw ();
00191       friend inline bool operator!  (const cinterval & a)                    throw();
00192 
00193       // CI-CI
00194 
00196       friend inline cinterval operator +(const cinterval &,const cinterval &) throw();
00198       friend inline cinterval operator -(const cinterval &,const cinterval &) throw();
00200       friend        cinterval operator *(const cinterval &,const cinterval &) throw();
00202       friend        cinterval operator /(const cinterval &,const cinterval &) throw(DIV_BY_ZERO);
00204       friend inline cinterval operator |(const cinterval &,const cinterval &) throw();
00206       friend inline cinterval operator &(const cinterval &,const cinterval &) throw(ERROR_CINTERVAL_EMPTY_INTERVAL);
00207       
00209       friend inline cinterval & operator +=(cinterval &, const cinterval &) throw();
00211       friend inline cinterval & operator -=(cinterval &, const cinterval &) throw();
00213       friend inline cinterval & operator *=(cinterval &, const cinterval &) throw();
00215       friend inline cinterval & operator /=(cinterval &, const cinterval &) throw();
00217       friend inline cinterval & operator |=(cinterval &, const cinterval &) throw();
00219       friend inline cinterval & operator &=(cinterval &, const cinterval &) throw(ERROR_CINTERVAL_EMPTY_INTERVAL);
00220       
00221       // CI-R
00222       
00224       friend inline cinterval operator +(const cinterval &,const real &) throw();
00226       friend inline cinterval operator +(const real &,const cinterval &) throw();
00228       friend inline cinterval operator -(const cinterval &,const real &) throw();
00230       friend inline cinterval operator -(const real &,const cinterval &) throw();
00232       friend inline cinterval operator *(const cinterval &,const real &) throw();
00234       friend inline cinterval operator *(const real &,const cinterval &) throw();
00236       friend inline cinterval operator /(const cinterval &,const real &) throw();
00238       friend inline cinterval operator /(const real &,const cinterval &) throw();
00240       friend inline cinterval operator |(const cinterval &,const real &) throw();
00242       friend inline cinterval operator |(const real &,const cinterval &) throw();
00244       friend inline cinterval operator &(const cinterval &,const real &) throw();
00246       friend inline cinterval operator &(const real &,const cinterval &) throw();
00247       
00249       friend inline cinterval & operator +=(cinterval &, const real &) throw();
00251       friend inline cinterval & operator -=(cinterval &, const real &) throw();
00253       friend inline cinterval & operator *=(cinterval &, const real &) throw();
00255       friend inline cinterval & operator /=(cinterval &, const real &) throw();
00257       friend inline cinterval & operator |=(cinterval &, const real &) throw();
00259       friend inline cinterval & operator &=(cinterval &, const real &) throw();
00260       
00261       // CI-I
00262 
00264       friend inline cinterval operator +(const cinterval &,const interval &) throw();
00266       friend inline cinterval operator +(const interval &,const cinterval &) throw();
00268       friend inline cinterval operator -(const cinterval &,const interval &) throw();
00270       friend inline cinterval operator -(const interval &,const cinterval &) throw();
00272       friend inline cinterval operator *(const cinterval &,const interval &) throw();
00274       friend inline cinterval operator *(const interval &,const cinterval &) throw();
00276       friend inline cinterval operator /(const cinterval &,const interval &) throw();
00278       friend inline cinterval operator /(const interval &,const cinterval &) throw();
00280       friend inline cinterval operator |(const cinterval &,const interval &) throw();
00282       friend inline cinterval operator |(const interval &,const cinterval &) throw();
00284       friend inline cinterval operator &(const cinterval &,const interval &) throw();
00286       friend inline cinterval operator &(const interval &,const cinterval &) throw();
00287       
00289       friend inline cinterval & operator +=(cinterval &, const interval &) throw();
00291       friend inline cinterval & operator -=(cinterval &, const interval &) throw();
00293       friend inline cinterval & operator *=(cinterval &, const interval &) throw();
00295       friend inline cinterval & operator /=(cinterval &, const interval &) throw();
00297       friend inline cinterval & operator |=(cinterval &, const interval &) throw();
00299       friend inline cinterval & operator &=(cinterval &, const interval &) throw();
00300 
00301       // CI-C
00302 
00304       friend inline cinterval operator +(const cinterval &,const complex &) throw();
00306       friend inline cinterval operator +(const complex &,const cinterval &) throw();
00308       friend inline cinterval operator -(const cinterval &,const complex &) throw();
00310       friend inline cinterval operator -(const complex &,const cinterval &) throw();
00312       friend inline cinterval operator *(const cinterval &,const complex &) throw();
00314       friend inline cinterval operator *(const complex &,const cinterval &) throw();
00316       friend inline cinterval operator /(const cinterval &,const complex &) throw();
00318       friend inline cinterval operator /(const complex &,const cinterval &) throw();
00320       friend inline cinterval operator |(const cinterval &,const complex &) throw();
00322       friend inline cinterval operator |(const complex &,const cinterval &) throw();
00324       friend inline cinterval operator &(const cinterval &,const complex &) throw();
00326       friend inline cinterval operator &(const complex &,const cinterval &) throw();
00327       
00328 
00330       friend inline cinterval & operator +=(cinterval &, const complex &) throw();
00332       friend inline cinterval & operator -=(cinterval &, const complex &) throw();
00334       friend inline cinterval & operator *=(cinterval &, const complex &) throw();
00336       friend inline cinterval & operator /=(cinterval &, const complex &) throw();
00338       friend inline cinterval & operator |=(cinterval &, const complex &) throw();
00340       friend inline cinterval & operator &=(cinterval &, const complex &) throw();
00341       
00342       // C-R
00343 
00345       friend inline cinterval operator |(const complex &,const real &) throw();
00347       friend inline cinterval operator |(const real &,const complex &) throw();
00348 
00349       // C-I
00350 
00352       friend inline cinterval operator +(const complex &,const interval &) throw();
00354       friend inline cinterval operator +(const interval &,const complex &) throw();
00356       friend inline cinterval operator -(const complex &,const interval &) throw();
00358       friend inline cinterval operator -(const interval &,const complex &) throw();
00360       friend inline cinterval operator *(const complex &,const interval &) throw();
00362       friend inline cinterval operator *(const interval &,const complex &) throw();
00364       friend inline cinterval operator /(const complex &,const interval &) throw();
00366       friend inline cinterval operator /(const interval &,const complex &) throw();
00368       friend inline cinterval operator |(const complex &,const interval &) throw();
00370       friend inline cinterval operator |(const interval &,const complex &) throw();
00372       friend inline cinterval operator &(const complex &,const interval &) throw();
00374       friend inline cinterval operator &(const interval &,const complex &) throw();
00375       
00376 
00377       // C-C
00378 
00380       friend inline cinterval operator |(const complex &,const complex &) throw();
00381 
00382       // ---- Comp.Operat.  ---------------------------------------
00383       
00385       friend inline bool operator== (const cinterval & a, const cinterval & b) throw();
00387       friend inline bool operator!= (const cinterval & a, const cinterval & b) throw();
00388       
00389       // CI-R
00390       
00392       friend inline bool operator== (const cinterval & a, const real & b)    throw();
00394       friend inline bool operator== (const real & a, const cinterval & b)    throw();
00396       friend inline bool operator!= (const cinterval & a, const real & b)    throw();
00398       friend inline bool operator!= (const real & a, const cinterval & b)    throw();
00399 
00400       // CI-I
00401       
00403       friend inline bool operator== (const cinterval & a, const interval & b)    throw();
00405       friend inline bool operator== (const interval & a, const cinterval & b)    throw();
00407       friend inline bool operator!= (const cinterval & a, const interval & b)    throw();
00409       friend inline bool operator!= (const interval & a, const cinterval & b)    throw();
00410 
00411       // CI-C
00412       
00414       friend inline bool operator== (const cinterval & a, const complex & b)    throw();
00416       friend inline bool operator== (const complex & a, const cinterval & b)    throw();
00418       friend inline bool operator!= (const cinterval & a, const complex & b)    throw();
00420       friend inline bool operator!= (const complex & a, const cinterval & b)    throw();
00421 
00422       // ---- Set Operators ----
00423       
00425       friend inline bool operator  <(const cinterval &,const cinterval &) throw();
00427       friend inline bool operator  >(const cinterval &,const cinterval &) throw();
00429       friend inline bool operator <=(const cinterval &,const cinterval &) throw();
00431       friend inline bool operator >=(const cinterval &,const cinterval &) throw();
00432 
00433       // CI-R
00434 
00436       friend inline bool operator  <(const real &,const cinterval &) throw();
00438       friend inline bool operator  >(const real &,const cinterval &) throw();
00440       friend inline bool operator <=(const real &,const cinterval &) throw();
00442       friend inline bool operator >=(const real &,const cinterval &) throw();
00443 
00445       friend inline bool operator  <(const cinterval &,const real &) throw();
00447       friend inline bool operator  >(const cinterval &,const real &) throw();
00449       friend inline bool operator <=(const cinterval &,const real &) throw();
00451       friend inline bool operator >=(const cinterval &,const real &) throw();
00452 
00453       // CI-I
00454 
00456       friend inline bool operator  <(const interval &,const cinterval &) throw();
00458       friend inline bool operator  >(const interval &,const cinterval &) throw();
00460       friend inline bool operator <=(const interval &,const cinterval &) throw();
00462       friend inline bool operator >=(const interval &,const cinterval &) throw();
00463 
00465       friend inline bool operator  <(const cinterval &,const interval &) throw();
00467       friend inline bool operator  >(const cinterval &,const interval &) throw();
00469       friend inline bool operator <=(const cinterval &,const interval &) throw();
00471       friend inline bool operator >=(const cinterval &,const interval &) throw();
00472 
00473       // CI-C
00474 
00476       friend inline bool operator  <(const complex &,const cinterval &) throw();
00478       friend inline bool operator  >(const complex &,const cinterval &) throw();
00480       friend inline bool operator <=(const complex &,const cinterval &) throw();
00482       friend inline bool operator >=(const complex &,const cinterval &) throw();
00483 
00485       friend inline bool operator  <(const cinterval &,const complex &) throw();
00487       friend inline bool operator  >(const cinterval &,const complex &) throw();
00489       friend inline bool operator <=(const cinterval &,const complex &) throw();
00491       friend inline bool operator >=(const cinterval &,const complex &) throw();
00492 
00493       // ---- Others   -------------------------------------------
00495       friend inline complex    Inf(const cinterval &) throw();
00497       friend inline complex    Sup(const cinterval &) throw();
00498       
00500       friend inline cinterval & SetInf(cinterval &,const complex &) throw(ERROR_CINTERVAL_EMPTY_INTERVAL);
00502       friend inline cinterval & SetInf(cinterval &,const real &) throw(ERROR_CINTERVAL_EMPTY_INTERVAL);
00504       friend inline cinterval & SetSup(cinterval &,const complex &) throw(ERROR_CINTERVAL_EMPTY_INTERVAL);
00506       friend inline cinterval & SetSup(cinterval &,const real &) throw(ERROR_CINTERVAL_EMPTY_INTERVAL);
00508       friend inline cinterval & UncheckedSetInf(cinterval &,const complex &) throw();
00510       friend inline cinterval & UncheckedSetInf(cinterval &,const real &)    throw();
00512       friend inline cinterval & UncheckedSetSup(cinterval &,const complex &) throw();
00514       friend inline cinterval & UncheckedSetSup(cinterval &,const real &)    throw();
00515       
00517       friend inline interval & Re(cinterval & a)       throw();
00519       friend inline interval   Re(const cinterval & a) throw();
00521       friend inline interval & Im(cinterval & a)       throw();
00523       friend inline interval   Im(const cinterval & a) throw();
00524       
00526       friend inline cinterval & SetRe(cinterval & a,const interval & b);
00528       friend inline cinterval & SetIm(cinterval & a,const interval & b); 
00530       friend inline cinterval & SetRe(cinterval & a,const real     & b);
00532       friend inline cinterval & SetIm(cinterval & a,const real     & b);
00533 
00535       friend inline real InfRe(const cinterval &a) throw();
00537       friend inline real InfIm(const cinterval &a) throw();
00539       friend inline real SupRe(const cinterval &a) throw();
00541       friend inline real SupIm(const cinterval &a) throw();
00542       
00544       friend inline real & InfRe(cinterval &a) throw();
00546       friend inline real & InfIm(cinterval &a) throw();
00548       friend inline real & SupRe(cinterval &a) throw();
00550       friend inline real & SupIm(cinterval &a) throw();
00551       
00553       friend        interval  abs(const cinterval &) throw();
00555       friend inline cinterval conj(const cinterval &) throw();
00557       friend inline   complex mid(const cinterval &) throw();
00559       friend inline   complex diam(const cinterval &) throw();
00560 };
00561 
00563 extern int       in   ( const cinterval&, const cinterval& );
00565 extern cinterval Blow ( cinterval, const real& );
00566 
00567 // Additional declaration of friend functions outside class cinterval
00568 interval  abs(const cinterval &) throw();
00569 
00570 } // namespace cxsc 
00571 
00572 #include "cinterval.inl"
00573 #include "cimath.hpp"
00574 
00575 #endif // _CXSC_CINTERVAL_HPP_INCLUDED
00576