- Home
- About DUNE
- Download
- Documentation
- Community
- Development
00001 #ifndef DUNE_GMPFIELD_HH 00002 #define DUNE_GMPFIELD_HH 00003 00004 #include <iostream> 00005 00006 #if HAVE_GMP 00007 00008 #include <gmpxx.h> 00009 00010 namespace Dune 00011 { 00012 00013 template< unsigned int precision > 00014 class GMPField 00015 : public mpf_class 00016 { 00017 typedef mpf_class Base; 00018 00019 public: 00020 GMPField () 00021 : Base(0,precision) 00022 {} 00023 00024 template< class T > 00025 GMPField ( const T &v ) 00026 : Base( v,precision ) 00027 {} 00028 00029 /* 00030 GMPField &operator=(const GMPField &other) 00031 { 00032 Base(*this) = Base(other); 00033 return *this; 00034 } 00035 */ 00036 00037 // type conversion operators 00038 operator double () const 00039 { 00040 return this->get_d(); 00041 } 00042 00043 operator float () const 00044 { 00045 return this->get_d(); 00046 } 00047 00048 operator mpf_class () const 00049 { 00050 return static_cast<const mpf_class&>(*this); 00051 } 00052 }; 00053 00054 00055 00056 template< unsigned int precision > 00057 inline GMPField< precision > 00058 operator+ ( const GMPField< precision > &a, const GMPField< precision > &b ) 00059 { 00060 typedef mpf_class F; 00061 return ((const F &)a + (const F &)b); 00062 } 00063 00064 template< unsigned int precision > 00065 inline GMPField< precision > 00066 operator- ( const GMPField< precision > &a, const GMPField< precision > &b ) 00067 { 00068 typedef mpf_class F; 00069 return ((const F &)a - (const F &)b); 00070 } 00071 00072 template< unsigned int precision > 00073 inline GMPField< precision > 00074 operator- ( const GMPField< precision > &a ) 00075 { 00076 typedef mpf_class F; 00077 return -((const F &)a); 00078 } 00079 00080 template< unsigned int precision > 00081 inline GMPField< precision > 00082 operator* ( const GMPField< precision > &a, const GMPField< precision > &b ) 00083 { 00084 typedef mpf_class F; 00085 return ((const F &)a * (const F &)b); 00086 } 00087 00088 template< unsigned int precision > 00089 inline GMPField< precision > 00090 operator/ ( const GMPField< precision > &a, const GMPField< precision > &b ) 00091 { 00092 typedef mpf_class F; 00093 return ((const F &)a / (const F &)b); 00094 } 00095 00096 00097 00098 template< unsigned int precision > 00099 inline std::ostream & 00100 operator<< ( std::ostream &out, const GMPField< precision > &value ) 00101 { 00102 return out << static_cast<const mpf_class&>(value); 00103 } 00104 00105 } 00106 00107 namespace std 00108 { 00109 00110 template< unsigned int precision > 00111 inline Dune::GMPField< precision > 00112 sqrt ( const Dune::GMPField< precision > &a ) 00113 { 00114 return Dune::GMPField< precision >(sqrt(static_cast<const mpf_class&>(a))); 00115 } 00116 00117 template< unsigned int precision > 00118 inline Dune::GMPField< precision > 00119 abs ( const Dune::GMPField< precision > &a ) 00120 { 00121 return Dune::GMPField< precision >( abs( static_cast< const mpf_class & >( a ) ) ); 00122 } 00123 00124 } 00125 00126 #endif // HAVE_GMP 00127 00128 #endif // #ifndef DUNE_GMPFIELD_HH
Generated on Fri Apr 29 2011 with Doxygen (ver 1.7.1) [doxygen-log,error-log].