numerix_doc 0.4
|
00001 #ifndef numerix_kernel_hpp 00002 #define numerix_kernel_hpp 00003 00004 #include <math.h> 00005 #include <basix/basix.hpp> 00006 #include <basix/glue.hpp> 00007 #include <numerix/integer.hpp> 00008 #include <numerix/integer_meta.hpp> 00009 #include <numerix/rational.hpp> 00010 #include <numerix/rational_meta.hpp> 00011 #include <numerix/floating.hpp> 00012 #include <numerix/floating_meta.hpp> 00013 #include <numerix/ball.hpp> 00014 #include <numerix/interval.hpp> 00015 00016 //#include <realroot/mpfr_rounding_mode.hpp> 00017 //#include <realroot/Interval.hpp> 00018 00019 00020 namespace mmx { 00021 template<class OSTREAM> inline void 00022 print(OSTREAM& os, const integer& x) { os << as_charp(as_string(x)); } 00023 00024 template<class OSTREAM> inline void 00025 print(OSTREAM& os, const rational& x) { 00026 os << as_charp(as_string(numerator(x))); 00027 if (denominator(x) != 1){ 00028 os <<"/"; 00029 os << as_charp(as_string(denominator(x))); 00030 } 00031 } 00032 00033 00034 template<class OSTREAM, class V> inline void 00035 print(OSTREAM& os, const floating<V>& x) { os << as_charp(as_string(x)); } 00036 00037 00038 00039 template<class X> struct scalar_set { 00040 typedef X T; 00041 scalar_set(){} 00042 scalar_set(const scalar_set<X>& t) {} 00043 scalar_set(const X& x) {} 00044 }; 00045 00046 template<class X> 00047 bool operator== (const scalar_set<X>& r1, const scalar_set<X>& r2) { return true; } 00048 template<class X> 00049 bool operator!= (const scalar_set<X>& r1, const scalar_set<X>& r2) { return !(r1==r2); } 00050 template<class C> inline int hash(const scalar_set<C>& R){ return 1;} 00051 template<class C> inline int exact_hash(const scalar_set<C>& R){ return 1;} 00052 template<class C> inline bool 00053 exact_eq(const scalar_set<C>& R1, const scalar_set<C>& R2) { 00054 return R1==R2; 00055 } 00056 00057 template<class C> inline scalar_set<C> make_set(const C& c) { 00058 return scalar_set<C>(); 00059 } 00060 00061 template<typename U,typename T> 00062 struct as_helper<scalar_set<U>,scalar_set<T> > { 00063 static inline 00064 scalar_set<U> cv (const scalar_set<T>& x) { return scalar_set<U>(); } 00065 }; 00066 00067 #define set_of(T) scalar_set< T > () 00068 00069 #define DECLARE_SCALAR_SET(X,T) \ 00070 inline syntactic flatten(const scalar_set<T>& Z){return syntactic(X);} \ 00071 00072 #define bigfloat floating<> 00073 00074 DECLARE_SCALAR_SET("DD",double); 00075 DECLARE_SCALAR_SET("ZZ",integer); 00076 DECLARE_SCALAR_SET("QQ",rational); 00077 DECLARE_SCALAR_SET("RR",bigfloat); 00078 DECLARE_SCALAR_SET("CD",complex< double >); 00079 DECLARE_SCALAR_SET("CC",complex< bigfloat >); 00080 00081 #ifndef WITH_AS 00082 #define WITH_AS 00083 template<typename T,typename F> 00084 struct as_helper { static inline T cv (const F& x) { return x; } }; 00085 00086 template<typename T,typename F> inline T as (const F& x) { return as_helper<T,F>::cv (x); } 00087 #endif 00088 00089 00090 struct Numerix { 00091 00092 typedef ::mmx::integer integer; 00093 typedef ::mmx::rational rational; 00094 typedef ::mmx::floating<> floating; 00095 typedef double ieee; 00096 00097 typedef ::mmx::interval<rational> interval_rational; 00098 }; 00099 00100 00101 namespace texp { 00102 template<class R> struct kernelof_; 00103 // template<> struct kernelof_<Numerix::ieee> { typedef Numerix T; }; 00104 template<> struct kernelof_<Numerix::integer> { typedef Numerix T; }; 00105 template<> struct kernelof_<Numerix::rational> { typedef Numerix T; }; 00106 template<> struct kernelof_<Numerix::floating> { typedef Numerix T; }; 00107 } 00108 00109 // inline int floor(double x) { return (int)std::floor(x);} 00110 00111 template<class T> inline 00112 bool singleton(const interval<T>& x ) { return lower(x) == upper(x); }; 00113 00114 namespace meta { 00115 template<class C> struct kernelof_; 00116 template<> struct kernelof_< integer > { typedef Numerix T; }; 00117 template<> struct kernelof_< rational > { typedef Numerix T; }; 00118 template<> struct kernelof_< floating<> > { typedef Numerix T; }; 00119 00120 // template<class C> struct structureof_; 00121 // template<> struct structureof_< integer > { typedef structure::scalar T; }; 00122 // template<> struct structureof_< rational > { typedef structure::scalar T; }; 00123 // template<> struct structureof_< floating<> > { typedef structure::scalar T; }; 00124 00125 } 00126 00127 00128 00129 namespace let { 00130 template<class A,class B> void assign(A& a, const B&b); 00131 00132 inline void 00133 assign(rational& q, char* s) {q= rational(integer(s)); } 00134 00135 // template<> inline void assign(double& x, const integer& z) {x = as_double(z);} 00136 template<> inline void 00137 assign(double& x, const rational& q) {x = as_double(q);} 00138 // template<> inline void assign(double& x, const floating<>& r){x = as_double(r);} 00139 00140 00141 template<> inline void 00142 assign(floating<>& r, const int& n) {r = floating<>(n);} 00143 00144 // template<class C, class T> inline void 00145 // assign( Interval<C>& a, const T & b ) { 00146 // C mn,mx; 00147 // { 00148 // numerics::rounding<C> rnd( numerics::rounding<C>::rnd_up() ); 00149 // assign(mx,b); 00150 // } 00151 // 00152 // { 00153 // numerics::rounding<C> rhd( numerics::rounding<C>::rnd_dw() ); 00154 // assign(mn,b); 00155 // } 00156 // if( mx < mn ) std::swap(mn,mx); 00157 // new (&a) Interval<C>(mn,mx); 00158 // }; 00159 } 00160 00161 00162 inline bool less_prec(const rational& q, unsigned prec) 00163 { 00164 integer n; 00165 if(q<0) 00166 n=-(numerator(q)<<prec); 00167 else 00168 n=numerator(q)<<prec; 00169 return (n<denominator(q)); 00170 } 00171 00172 inline rational nearest(const floating<>& x, int prec) 00173 { 00174 integer er = integer(1)<<prec; 00175 00176 floating<> r=(x>0?x:-x), f = floor(r); 00177 integer a=as_integer(f); 00178 00179 integer n0=1, n1= a, tn=a; 00180 integer d0=0, d1= 1, td=1; 00181 00182 for(;d0*d1<er && r!=f;) 00183 { 00184 r=1/(r-f); f = floor(r); 00185 a=as_integer(f); 00186 n1*=a;n1+=n0;n0=tn;tn=n1; 00187 d1*=a;d1+=d0;d0=td;td=d1; 00188 } 00189 return (x>0? rational(n1)/d1: rational(-n1)/d1); 00190 } 00191 template<> struct as_helper<rational,floating<> > 00192 { 00193 static inline 00194 rational cv (const floating<>& x) 00195 { 00196 return nearest(x,precision(x)); 00197 } 00198 }; 00199 00200 template<> struct as_helper<double,floating<> > 00201 { 00202 static inline double cv (const floating<>& x) { return as_double(x); } 00203 }; 00204 00205 // template<> struct as_helper< Interval<double>, rational> 00206 00207 // { 00208 // static inline Interval<double> cv(const rational & b ) 00209 // { 00210 // double mn,mx; 00211 // { 00212 // numerics::rounding<double> rnd( numerics::rounding<double>::rnd_up() ); 00213 // let::assign(mx,b); 00214 // } 00215 00216 // { 00217 // numerics::rounding<double> rhd( numerics::rounding<double>::rnd_dw() ); 00218 // let::assign(mn,b); 00219 // } 00220 // if( mx < mn ) std::swap(mn,mx); 00221 // return Interval<double>(mn,mx); 00222 // } 00223 // }; 00224 00225 } 00226 #endif //numerix_kernel_hpp