Main Page   Packages   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Search  

C:/temp/src/j2k/Beta/Math/MCNumber.hpp

Go to the documentation of this file.
00001 #ifndef __J2K__Number_Macro_HPP__
00002 #define __J2K__Number_Macro_HPP__
00003 
00004 // Missing += *= -=  /= <<= >>= &&= &= |= etc.
00005 
00006 // Too long to do it by hand, so let's do it with a Macro ! =)
00007 // e.g.  MC_Number_Operators1( Double, double )
00008 //       MC_Number_Operators2( Double, double, double  )
00009 //       MC_Number_Operators2( Double, double, int     )
00010 //       MC_Number_Operators2( Double, double, float   )
00011 //       MC_Number_Operators2( Double, double, long    )
00012 //       MC_Number_Verify( double, 0.0 )
00013 
00014 #define MC_Number_Verify( cast, ZERO )                                
00015   inline void verify() {                                              
00016      if ( s != Valid ) return;                                        
00017      if ( temp > ZERO ) {  status = Pos;  }                           
00018      if ( temp < ZERO ) {  status = Neg;  }                           
00019      status = Zero;                                                   
00020   }                                                                   
00021                                                                       
00022   inline MathState verify( cast n ) {                                 
00023      if ( n > ZERO ) return Pos;                                      
00024      if ( n < ZERO ) return Neg;                                      
00025      return  Zero;                                                    
00026   }                                                                   
00027                                                                       
00028   MathState getState( const char* s ) {                               
00029     if ( s == NULL ) return Zero;                                     
00030     if ( strlen(s) < 2 ) return Valid;                                
00031                                                                       
00032     char* sUp = strupr( strdup( s ) );                                
00033                                                                       
00034     char* sPosInf  = "POSITIVE INFINITE POSINFINITE +INFINITE";       
00035     char* sNegInf  = "NEGATIVE INFINITE NEGINFINITE -INFINITE";       
00036     char* sNaN     = "NAN";                                           
00037     char* sFPError = "FPERROR FLOATING-POINT ERROR FLOAT ERROR";      
00038                                                                       
00039     char* f1 = strstr( sPosInf,  sUp );                               
00040     char* f2 = strstr( sNegInf,  sUp );                               
00041     char* f3 = strstr( sNaN,     sUp );                               
00042     char* f4 = strstr( sFPError, sUp );                               
00043                                                                       
00044     long n1 = (long)( f1 - sUp );                                     
00045     long n2 = (long)( f2 - sUp );                                     
00046     long n3 = (long)( f3 - sUp );                                     
00047     long n4 = (long)( f4 - sUp );                                     
00048                                                                       
00049     #ifdef __J2K__DEBUG                                               
00050        printf("Up=[%s](%d)\n", sUp, strlen(sUp) );                    
00051        printf("f1=[%s](%d)\n", f1,  n1 );                             
00052        printf("f2=[%s](%d)\n", f2,  n2 );                             
00053        printf("f3=[%s](%d)\n", f3,  n3 );                             
00054        printf("f4=[%s](%d)\n", f4,  n4 );                             
00055     #endif                                                            
00056                                                                       
00057     if ( n1 > 0 ) return PosInf;                                      
00058     if ( n2 > 0 ) return NegInf;                                      
00059     if ( n3 > 0 ) return NaN;                                         
00060     if ( n4 > 0 ) return FPError;                                     
00061                                                                       
00062     return Valid;                                                     
00063   }                                                                   
00064 
00065 
00066 #define MC_Number_Operators1( Number, cast )                          
00067   // Compare Operators: Part 1                                        
00068   friend BOOL isEqualTo( const Number& l, const Number& r ) {         
00069     int temp = MathStateEqualTo[ (int)l.state ][ (int)r.state ];      
00070     if ( temp < 2 ) return (BOOL)temp;                                
00071     return ( l.value == r.value );                                    
00072   }                                                                   
00073                                                                       
00074   friend BOOL isLessThan( const Number& l, const Number& r ) {        
00075     int temp = MathStateLessThan[ (int)l.state ][ (int)r.state ];     
00076     if ( temp < 2 ) return (BOOL)temp;                                
00077     return (l.value <  r.value);                                      
00078   }                                                                   
00079                                                                       
00080   friend BOOL isBiggerThan( const Number& l, const Number& r ) {      
00081     int temp = MathStateBiggerThan[ (int)l.state ][ (int)r.state ];   
00082     if ( temp < 2 ) return (BOOL)temp;                                
00083     return (l.value >  r.value);                                      
00084   }                                                                   
00085                                                                       
00086   inline friend BOOL operator==( const Number& l, const Number& r ) { 
00087     return   isEqualTo( l, r );                                       
00088   }                                                                   
00089                                                                       
00090   inline friend BOOL operator!=( const Number& l, const Number& r ) { 
00091     return  !isEqualTo( l, r );                                       
00092   }                                                                   
00093                                                                       
00094   inline friend BOOL operator<(  const Number& l, const Number& r ) { 
00095     return  isLessThan( l, r );                                       
00096   }                                                                   
00097                                                                       
00098   inline friend BOOL operator<=( const Number& l, const Number& r ) { 
00099     return  ( isLessThan( l, r ) || isEqualTo( l, r ) );              
00100   }                                                                   
00101                                                                       
00102   inline friend BOOL operator>(  const Number& l, const Number& r ) { 
00103     return  isBiggerThan( l, r );                                     
00104   }                                                                   
00105                                                                       
00106   inline friend BOOL operator>=( const Number& l, const Number& r ) { 
00107     return  ( isBiggerThan( l, r ) || isEqualTo( l, r ) );            
00108   }                                                                   
00109                                                                       
00110   // Arithmetic Operators: Part 1                                     
00111   friend Number add( const Number& l, const Number& r ) {             
00112     MathState s = MathStateAdd[ (int)l.state ][ (int)r.state ];       
00113     return Number( l.value + r.value, s );                            
00114   }                                                                   
00115                                                                       
00116   friend Number sub( const Number& l, const Number& r ) {             
00117     MathState s = MathStateSub[ (int)l.state ][ (int)r.state ];       
00118     return Number( l.value - r.value, s );                            
00119   }                                                                   
00120                                                                       
00121   friend Number mult( const Number& l, const Number& r ) {            
00122     MathState s = MathStateMult[ (int)l.state ][ (int)r.state ];      
00123     return Number( l.value * r.value, s );                            
00124   }                                                                   
00125                                                                       
00126   friend Number div( const Number& l, const Number& r ) {             
00127     MathState s = MathStateDiv[ (int)l.state ][ (int)r.state ];       
00128     if ( s != Valid ) return Number( l.value, s );                    
00129     return Number( l.value / r.value, s );                            
00130   }                                                                   
00131                                                                       
00132   inline friend Number operator+( const Number& l, const Number& r ) {
00133     return add( l, r );                                               
00134   }                                                                   
00135                                                                       
00136   inline friend Number operator-( const Number& l, const Number& r ) {
00137     return sub( l, r );                                               
00138   }                                                                   
00139                                                                       
00140   inline friend Number operator*( const Number& l, const Number& r ) {
00141     return mult( l, r );                                              
00142   }                                                                   
00143                                                                       
00144   inline friend Number operator/( const Number& l, const Number& r ) {
00145     return div( l, r );                                               
00146   }                                                                   
00147                                                                       
00148   // Other Operators: Part 1                                          
00149   inline const Number &operator=(const Number& N ) {                  
00150     value  = N.value;                                                 
00151     status = N.status;                                                
00152     return *this;                                                     
00153   }                                                                   
00154                                                                       
00155   inline Number operator!() {                                         
00156     return Number( !value, status );                                  
00157   }                                                                   
00158                                                                       
00159   inline Number operator-() {                                         
00160     if ( (int)status < 4 ) return Number( (-1) * value, Valid );      
00161     return Number( (-1) * value, status );                            
00162   }                                                                   
00163                                                                       
00164   // (int) means post-increment/decrement                             
00165   inline Number operator--() {                                        
00166     --value;                                                          
00167     return *this;                                                     
00168   }                                                                   
00169                                                                       
00170   inline Number operator--( int ) {                                   
00171     value--;                                                          
00172     return *this;                                                     
00173   }                                                                   
00174                                                                       
00175   inline Number operator++() {                                        
00176     ++value;                                                          
00177     return *this;                                                     
00178   }                                                                   
00179                                                                       
00180   inline Number operator++( int ) {                                   
00181     value++;                                                          
00182     return *this;                                                     
00183   }                                                                   
00184 
00185 
00186 #define MC_Number_Operators2( Number, cast, number )                  
00187   // Compare Operators: Part 3                                       
00188   friend BOOL isEqualTo( const Number& l, const number& n ) {         
00189     cast v = (cast)n;                                                 
00190     int temp = MathStateEqualTo[ (int)l.state ][ (int)verify(v) ];    
00191     if ( temp < 2 ) return (BOOL)temp;                                
00192     return ( l.value == v );                                          
00193   }                                                                   
00194                                                                       
00195   friend BOOL isLessThan( const Number& l, const number& n ) {        
00196     cast v = (cast)n;                                                 
00197     int temp = MathStateLessThan[ (int)l.state ][ (int)verify(v) ];   
00198     if ( temp < 2 ) return (BOOL)temp;                                
00199     return ( l.value < v );                                           
00200   }                                                                   
00201                                                                       
00202   friend BOOL isBiggerThan( const Number& l, const number& n ) {      
00203     cast v = (cast)n;                                                 
00204     int temp = MathStateBiggerThan[ (int)l.state ][ (int)verify(v) ]; 
00205     if ( temp < 2 ) return (BOOL)temp;                                
00206     return (l.value > v );                                            
00207   }                                                                   
00208                                                                       
00209   inline friend BOOL operator==( const Number& l, const number n ) {  
00210     return  isEqualTo( l, n );                                        
00211   }                                                                   
00212                                                                       
00213   inline friend BOOL operator!=( const Number& l, const number n ) {  
00214     return !isEqualTo( l, n );                                        
00215   }                                                                   
00216                                                                       
00217   inline friend BOOL operator<(  const Number& l, const number n ) {  
00218     return  isLessThan( l, n );                                       
00219   }                                                                   
00220                                                                       
00221   inline friend BOOL operator<=( const Number& l, const number n ) {  
00222     return ( isLessThan( l, n ) || isEqualTo( l, n ) );               
00223   }                                                                   
00224                                                                       
00225   inline friend BOOL operator>(  const Number& l, const number n ) {  
00226     return  isBiggerThan( l, n );                                     
00227   }                                                                   
00228                                                                       
00229   inline friend BOOL operator>=( const Number& l, const number n ) {  
00230     return ( isBiggerThan( l, n ) || isEqualTo( l, n ) );             
00231   }                                                                   
00232                                                                       
00233   inline friend BOOL operator==( const number n, const Number& r ) {  
00234     return  isEqualTo( r, n );                                        
00235   }                                                                   
00236                                                                       
00237   inline friend BOOL operator!=( const number n, const Number& r ) {  
00238     return !isEqualTo( r, n );                                        
00239   }                                                                  
00240                                                                      
00241   inline friend BOOL operator<(  const number n, const Number& r ) {  
00242     return  isBiggerThan( r, n );                                     
00243   }                                                                   
00244                                                                       
00245   inline friend BOOL operator<=( const number n, const Number& r ) {  
00246     return ( isBiggerThan( r, n ) || isEqualTo( r, n ) );             
00247   }                                                                   
00248                                                                       
00249   inline friend BOOL operator>(  const number n, const Number& r ) {  
00250     return  isLessThan( r, n );                                       
00251   }                                                                   
00252                                                                       
00253   inline friend BOOL operator>=( const number n, const Number& r ) {  
00254     return ( isLessThan( r, n ) || isEqualTo( r, n ) );               
00255   }                                                                   
00256                                                                       
00257   // Arithmetic Operators: Part 2                                     
00258   friend Number add( const Number& l, const number n ) {              
00259     cast v = (cast)n;                                                 
00260     MathState s = MathStateAdd[ (int)l.state ][ (int)verify(v) ];     
00261     return Number( l.value + v, s );                                  
00262   }                                                                   
00263                                                                       
00264   friend Number sub( const Number& l, const number n ) {              
00265     cast v = (cast)n;                                                 
00266     MathState s = MathStateSub[ (int)l.state ][ (int)verify(v) ];     
00267     return Number( l.value - v, s );                                  
00268   }                                                                   
00269                                                                       
00270   friend Number sub( const number n, const Number& r ) {              
00271     cast v = (cast)n;                                                 
00272     MathState s = MathStateSub[ (int)verify(v) ][ (int)r.state ]      
00273     return Number( v - r.value, s );                                  
00274   }                                                                   
00275                                                                       
00276   friend Number mult( const Number& l, const number n ) {             
00277     cast v = (cast)n;                                                 
00278     MathState s = MathStateMult[ (int)l.state ][ (int)verify(v) ];    
00279     return Number( l.value * v, s );                                  
00280   }                                                                   
00281                                                                       
00282   friend Number div( const Number& l, const number n ) {              
00283     cast v = (cast)n;                                                 
00284     MathState s = MathStateDiv[ (int)l.state ][ (int)verify(v) ];     
00285     if ( s != Valid ) return Number( l.value, s );                    
00286     return Number( l.value / v, s );                                  
00287   }                                                                   
00288                                                                       
00289   friend Number div( const number n, const Number& r ) {              
00290     cast v = (cast)n;                                                 
00291     MathState s = MathStateDiv[ (int)verify(v) ][ (int)r.state ];     
00292     if ( s != Valid ) return Number( v, s );                          
00293     return Number( v / r.value, s );                                  
00294   }                                                                   
00295                                                                       
00296   inline friend Number operator+( number n, const Number& r ) {       
00297     return add( r, n );                                               
00298   }                                                                   
00299                                                                       
00300   inline friend Number operator-( number n, const Number& r ) {       
00301     return sub( n, r );                                               
00302   }                                                                   
00303                                                                       
00304   inline friend Number operator*( number n, const Number& r ) {       
00305     return mult( r, n );                                              
00306   }                                                                   
00307                                                                       
00308   inline friend Number operator/( number n, const Number& r ) {       
00309     return div( n, r );                                               
00310   }                                                                   
00311                                                                       
00312   // Arithmetic Operators: Part 3                                     
00313   inline friend Number operator+( const Number& l, const number n ) { 
00314     return add( l, n );                                               
00315   }                                                                   
00316                                                                       
00317   inline friend Number operator-( const Number& l, const number n ) { 
00318     return sub( l, n );                                               
00319   }                                                                   
00320                                                                       
00321   inline friend Number operator*( const Number& l, const number n ) { 
00322     return mult( l, n );                                              
00323   }                                                                   
00324                                                                       
00325   inline friend Number operator/( const Number& l, const number n ) { 
00326     return div( l, n );                                               
00327   }                                                                   
00328                                                                       
00329   // Other Operators: Part 2                                          
00330   inline const Number &operator=(number n) {                          
00331     value  = (cast)n;                                                 
00332     status = verify( value );                                         
00333     return *this;                                                     
00334   }                                                                   
00335                                                                       
00336   inline operator number() const { return (number)value; }            
00337 
00338 
00339 
00340 #endif

Generated on Sun Oct 14 18:46:13 2001 for Standard J2K Library by doxygen1.2.11.1 written by Dimitri van Heesch, © 1997-2001