00001 #ifndef __J2K__Double_HPP__
00002 #define __J2K__Double_HPP__
00003
00004 #include <j2k/Fred/Number/MathStat.hpp>
00005 #include <j2k/Fred/Number/MCNumber.hpp>
00006 #include <stdlib.h>
00007
00008
00009
00010 class Double {
00011
00012 public:
00013 inline Double() : value(0), status( Valid ) {
00014 verify();
00015 }
00016
00017 inline Double(double v) : value(v), status( Valid ) {
00018 verify();
00019 }
00020
00021 inline Double(double v, enum MathState s) : value(v), status( s ) {
00022 verify();
00023 }
00024
00025 inline Double(const char *s) {
00026 status = getState( s );
00027 value = atof( s );
00028
00029 if ( (int)status < 3 ) {
00030 verify();
00031 }
00032 }
00033
00034 Double(const Double& D)
00035 : value( D.value ), status( D.status ) { }
00036
00037 inline virtual ~Double() { }
00038
00039 friend ostream& operator<<(ostream& os, Double& D) {
00040 unsigned int state = (unsigned int)(D.status);
00041 if ( state < 3 ) {
00042 return os << D.value;
00043 } else if ( state < J2K_MAX_MathState ) {
00044 return os << MathStateTxt[ state ];
00045 }
00046
00047
00048 abort();
00049 return os << "";
00050
00051 }
00052
00053
00054
00055 inline operator double() const {
00056 return (double)value;
00057 }
00058
00059 friend Double operator<<(const Double& l, const Double& r);
00060 friend Double operator>>(const Double& l, const Double& r);
00061 friend Double operator|( const Double& l, const Double& r);
00062 friend Double operator&( const Double& l, const Double& r);
00063 friend Double operator^( const Double& l, const Double& r);
00064
00065 inline Double operator~() {
00066 return Double( ~value );
00067 }
00068
00069
00070
00071
00072 MC_Number_Verify( double, 0.0 )
00073 MC_Number_Operators1( Double, double )
00074 MC_Number_Operators2( Double, double, long )
00075 MC_Number_Operators2( Double, double, float )
00076 MC_Number_Operators2( Double, double, double )
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 private:
00096 double value;
00097 enum MathState status;
00098 };
00099
00100 inline Double operator<<(const Double& l,const Double& r) {
00101 return Double(l.value<<r.value);
00102 }
00103
00104 inline Double operator>>(const Double& l,const Double& r) {
00105 return Double(l.value>>r.value);
00106 }
00107
00108 inline Double operator|(const Double& l,const Double& r) {
00109 return Double(l.value|r.value);
00110 }
00111
00112 inline Double operator&(const Double& l,const Double& r) {
00113 return Double(l.value&r.value);
00114 }
00115
00116 inline Double operator^(const Double& l,const Double& r) {
00117 return Double(l.value^r.value);
00118 }
00119
00120 #endif