00001 ////////////////////////////////////////////////////////////////////////
00002 // How to use this file: //
00003 // ===================== //
00004 // #define NUMBER Double /* The name of the class */ //
00005 // #define TYPE double /* The storage data type */ //
00006 // #define ZERO 0.0 /* The value zero in that data type */ //
00007 // //
00008 // class Double { //
00009 // // ... //
00010 // #include <j2k/Fred/Math/Number/NbVerify.hpp> //
00011 // #include <j2k/Fred/Math/Number/NbOperator1.hpp> //
00012 // //
00013 // /* Operator right handside */ //
00014 // /* Might consider automatic type upgrading for simplicity... //
00015 // #define TYPE2 double //
00016 // #include <j2k/Fred/Math/Number/NbOperator2.hpp> //
00017 // //
00018 // #define TYPE2 float //
00019 // #include <j2k/Fred/Math/Number/NbOperator2.hpp> //
00020 // //
00021 // #define TYPE2 signed long //
00022 // #include <j2k/Fred/Math/Number/NbOperator2.hpp> //
00023 // #define TYPE2 unsigned long //
00024 // #include <j2k/Fred/Math/Number/NbOperator2.hpp> //
00025 // //
00026 // #define TYPE2 signed short //
00027 // #include <j2k/Fred/Math/Number/NbOperator2.hpp> //
00028 // #define TYPE2 unsigned short //
00029 // #include <j2k/Fred/Math/Number/NbOperator2.hpp> //
00030 // //
00031 // #define TYPE2 signed char //
00032 // #include <j2k/Fred/Math/Number/NbOperator2.hpp> //
00033 // #define TYPE2 unsigned char //
00034 // #include <j2k/Fred/Math/Number/NbOperator2.hpp> //
00035 // //
00036 // #define TYPE2 signed int //
00037 // #include <j2k/Fred/Math/Number/NbOperator2.hpp> //
00038 // #define TYPE2 unsigned int //
00039 // #include <j2k/Fred/Math/Number/NbOperator2.hpp> //
00040 // }; //
00041 // #undef TYPE //
00042 // #undef ZERO //
00043 // #undef NUMBER //
00044 ////////////////////////////////////////////////////////////////////////
00045
00046 // Missing += *= -= /= <<= >>= &&= &= |= etc.
00047 // Too long to do it by hand, so let's do it with an #include Macro ! =)
00048
00049 #ifndef TYPE
00050 #error "TYPE is not defined !"
00051 #endif
00052
00053 #ifndef ZERO
00054 #error "ZERO is not defined !"
00055 #endif
00056
00057 void verify( MathState s, TYPE temp )
00058 {
00059 if ( s != Valid ) return;
00060
00061 if ( temp > ZERO ) { state = Pos; }
00062 else if ( temp < ZERO ) { state = Neg; }
00063 else { state = Zero; }
00064 }
00065
00066 static MathState verify( TYPE n )
00067 {
00068 if ( n > ZERO ) return Pos;
00069 if ( n < ZERO ) return Neg;
00070 return Zero;
00071 }
00072
00073 static MathState getState( const char* s )
00074 {
00075 if ( s == NULL ) return Zero;
00076 if ( strlen(s) < 2 ) return Valid;
00077
00078 char* sUp = strupr( strdup( s ) );
00079 char* sPosInf = "POSITIVE INFINITE POSINFINITE +INFINITE";
00080 char* sNegInf = "NEGATIVE INFINITE NEGINFINITE -INFINITE";
00081 char* sNaN = "NAN NaN";
00082 char* sFPError = "FPERROR FLOATING-POINT ERROR FLOAT ERROR";
00083
00084 char* f1 = strstr( sPosInf, sUp );
00085 char* f2 = strstr( sNegInf, sUp );
00086 char* f3 = strstr( sNaN, sUp );
00087 char* f4 = strstr( sFPError, sUp );
00088
00089 long n1 = (long)( f1 - sUp );
00090 long n2 = (long)( f2 - sUp );
00091 long n3 = (long)( f3 - sUp );
00092 long n4 = (long)( f4 - sUp );
00093
00094 #ifdef __J2K__DEBUG
00095 printf("Up=[%s](%d)\n", sUp, strlen(sUp) );
00096 printf("f1=[%s](%d)\n", f1, n1 );
00097 printf("f2=[%s](%d)\n", f2, n2 );
00098 printf("f3=[%s](%d)\n", f3, n3 );
00099 printf("f4=[%s](%d)\n", f4, n4 );
00100 #endif
00101
00102 if ( n1 > 0 ) return PosInf;
00103 if ( n2 > 0 ) return NegInf;
00104 if ( n3 > 0 ) return NaN;
00105 if ( n4 > 0 ) return FPError;
00106
00107 return Valid;
00108 }
1.2.11.1 written by Dimitri van Heesch,
© 1997-2001