synaps/arithm/rdw.h

00001 /********************************************************************
00002  *   This file is part of the source code of the SYNAPS library.
00003  *   Author(s): J.P. Pavone, GALAAD, INRIA
00004  *   $Id: rdw.h,v 1.1 2005/07/11 09:15:23 mourrain Exp $
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 //

SYNAPS DOCUMENTATION
logo