00001
00002
00003
00004
00005
00006 #ifndef SYNAPS_NUMERICS_RDW_H
00007 #define SYNAPS_NUMERICS_RDW_H
00008
00009 #include <synaps/arithm/rounding.h>
00010
00011 __BEGIN_NAMESPACE_SYNAPS
00012
00013 namespace numerics
00014 {
00015 namespace rdw
00016 {
00017 template< typename T > inline
00018 T upadd( const T& a, const T& b ) { T tmp = -a; tmp -= b; return -tmp; };
00019 template< typename T > inline
00020 T dwadd( const T& a, const T& b ) { return a+b; };
00021 template< typename T > inline
00022 T upsub( const T& a, const T& b ) { T tmp = b; tmp -= a; return -tmp; };
00023 template< typename T > inline
00024 T dwsub( const T& a, const T& b ) { return a-b; };
00025 template< typename T > inline
00026 T upmul( const T& a, const T& b ) { T tmp = -a; tmp *= b; return -tmp; };
00027 template< typename T > inline
00028 T dwmul( const T& a, const T& b ) { return a*b; };
00029 template< typename T > inline
00030 T updiv( const T& a, const T& b ) { T tmp = -a; tmp /= b; return -tmp; };
00031 template< typename T > inline
00032 T dwdiv( const T& a, const T& b ) { return a/b; };
00033 template< typename T > inline
00034 T updet( const T& a, const T& b, const T& c, const T& d )
00035 { return upsub(upmul(a,d),dwmul(b,c)); };
00036 template< typename T > inline
00037 T dwdet( const T& a, const T& b, const T& c, const T& d )
00038 { return dwsub(dwmul(a,d),upmul(b,c)); };
00039 };
00040
00041 namespace rup
00042 {
00043 template< typename T > inline
00044 T upadd( const T& a, const T& b ) { return a+b; };
00045 template< typename T > inline
00046 T dwadd( const T& a, const T& b ) { T tmp = -a; tmp -= b; return -tmp; };
00047 template< typename T > inline
00048 T upsub( const T& a, const T& b ) { return a-b; };
00049 template< typename T > inline
00050 T dwsub( const T& a, const T& b ) { T tmp = b; tmp -= a; return -tmp; };
00051 template< typename T > inline
00052 T upmul( const T& a, const T& b ) { return a*b; };
00053 template< typename T > inline
00054 T dwmul( const T& a, const T& b ) { T tmp = -a; tmp *= b; return -tmp; };
00055 template< typename T > inline
00056 T updiv( const T& a, const T& b ) { return a/b; };
00057 template< typename T > inline
00058 T dwdiv( const T& a, const T& b ) { T tmp = -a; tmp /= b; return -tmp; };
00059 template< typename T > inline
00060 T updet( const T& a, const T& b, const T& c, const T& d )
00061 { return upsub(upmul(a,d),dwmul(b,c)); };
00062 template< typename T > inline
00063 T dwdet( const T& a, const T& b, const T& c, const T& d )
00064 { return dwsub(dwmul(a,d),upmul(b,c)); };
00065 };
00066 };
00067
00068 __END_NAMESPACE_SYNAPS
00069
00070 #endif //