You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

211 lines
5.5 KiB
C

1 month ago
/**
* @file WDouble.h
* @brief double<EFBFBD>ͱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>þ<EFBFBD><EFBFBD><EFBFBD>
* @author ɳĮ<EFBFBD><EFBFBD>ѻ
* @date 2009-09-07
* @warning WDouble<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Ҫʵ<EFBFBD>ֵĹ<EFBFBD><EFBFBD><EFBFBD>
* 1) <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD>ֵ<EFBFBD>Ĭ<EFBFBD>Ͼ<EFBFBD><EFBFBD>Ⱥ͵<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><EFBFBD><EFBFBD>
* 2) <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼdoubleֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>þ<EFBFBD><EFBFBD>ȼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
* 3) ͬʱ֧<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>ʽ<EFBFBD><EFBFBD>
* 3) <EFBFBD><EFBFBD>С<EFBFBD>ȽϷ<EFBFBD><<EFBFBD><EFBFBD>><EFBFBD><EFBFBD><=<EFBFBD><EFBFBD>>=
* 4) ==<EFBFBD><EFBFBD>!=<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 5) +<EFBFBD><EFBFBD>-<EFBFBD><EFBFBD>*<EFBFBD><EFBFBD>/<EFBFBD><EFBFBD>+=<EFBFBD><EFBFBD>-=<EFBFBD><EFBFBD>*=<EFBFBD><EFBFBD>/=<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 6) <<<EFBFBD><EFBFBD>>><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
#pragma once
#include <iostream>
using std::ostream;
using std::istream;
namespace wuya
{
class AFX_EXT_CLASS WDouble
{
public:
WDouble(void);
WDouble(double dVal,size_t nPrecision = GetPrecisionDef());
WDouble(const WDouble& dVal);
~WDouble(void) throw();
WDouble& operator = (const WDouble& dVal);
WDouble& operator = (double dVal);
// operator
friend inline bool operator == (const WDouble& dVal1,const WDouble& dVal2);
friend inline bool operator != (const WDouble& dVal1,const WDouble& dVal2);
friend inline bool operator < (const WDouble& dVal1,const WDouble& dVal2);
friend inline bool operator > (const WDouble& dVal1,const WDouble& dVal2);
friend inline bool operator <= (const WDouble& dVal1,const WDouble& dVal2);
friend inline bool operator >= (const WDouble& dVal1,const WDouble& dVal2);
friend inline void operator += (WDouble& dVal1,const WDouble& dVal2); ///< <20><><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ׼
friend inline void operator -= (WDouble& dVal1,const WDouble& dVal2);
friend inline void operator *= (WDouble& dVal1,const WDouble& dVal2);
friend inline void operator /= (WDouble& dVal1,const WDouble& dVal2);
friend inline WDouble operator + (const WDouble& dVal1,const WDouble& dVal2); ///< <20><><EFBFBD><EFBFBD><EFBFBD>Ծ<EFBFBD><D4BE>Ƚϴ<C8BD><CFB4><EFBFBD>Ϊ׼
friend inline WDouble operator - (const WDouble& dVal1,const WDouble& dVal2);
friend inline WDouble operator * (const WDouble& dVal1,const WDouble& dVal2);
friend inline WDouble operator / (const WDouble& dVal1,const WDouble& dVal2);
friend inline ostream& operator << (ostream& os,const WDouble& object);
friend inline istream& operator >> (istream& is,WDouble& object);
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>WDouble<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param [in]nPrecision <EFBFBD><EFBFBD><EFBFBD><EFBFBD>double<EFBFBD>;<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><EFBFBD>10λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><EFBFBD>ΧΪ0-10<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹ÷<EFBFBD>Χֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void SetPrecision(size_t nPrecision);
/** @brief <09><><EFBFBD><EFBFBD>WDoule<6C><65><EFBFBD><EFBFBD> */
size_t GetPrecision() const;
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>doubleֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪWDouble<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
double Get() const;
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>doubleֵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪnPrecision
*/
double Get(size_t nPrecision) const;
/**
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>doubleֵ<EFBFBD><EFBFBD>δ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
double GetEnter() const;
static void SetPrecisionDef(size_t nPrecision);
static size_t GetPrecisionDef();
private:
/** @brief <09><>ԭʼ<D4AD><CABC><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
double Round(size_t nPrecision) const;
void Round();
private:
double m_dDbl; ///< <20><><EFBFBD>վ<EFBFBD><D5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>doubleֵ
double m_dDblEnter; ///< ԭʼdoubleֵ
size_t m_nPrecision; ///< double<6C><65><EFBFBD><EFBFBD>
static size_t m_nPrecisionDef; ///< Ĭ<>Ͼ<EFBFBD><CFBE>ȡ<EFBFBD>ֵΪ1<CEAA><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ծ<EFBFBD>ȷ<EFBFBD><C8B7>0.1
};
//operator
inline bool operator == (const WDouble& dVal1,const WDouble& dVal2)
{
return dVal1.m_dDbl == dVal2.m_dDbl;
}
inline bool operator != (const WDouble& dVal1,const WDouble& dVal2)
{
return dVal1.m_dDbl != dVal2.m_dDbl;
}
inline bool operator < (const WDouble& dVal1,const WDouble& dVal2)
{
return dVal1.m_dDbl < dVal2.m_dDbl;
}
inline bool operator > (const WDouble& dVal1,const WDouble& dVal2)
{
return dVal1.m_dDbl > dVal2.m_dDbl;
}
inline bool operator <= (const WDouble& dVal1,const WDouble& dVal2)
{
return dVal1.m_dDbl <= dVal2.m_dDbl;
}
inline bool operator >= (const WDouble& dVal1,const WDouble& dVal2)
{
return dVal1.m_dDbl >= dVal2.m_dDbl;
}
inline void operator += (WDouble& dVal1,const WDouble& dVal2)
{
dVal1.m_dDblEnter += dVal2.m_dDblEnter;
// <20><>dVal1<6C>ľ<EFBFBD><C4BE><EFBFBD>Ϊ׼
dVal1.Round();
}
inline void operator -= (WDouble& dVal1,const WDouble& dVal2)
{
dVal1.m_dDblEnter -= dVal2.m_dDblEnter;
// <20><>dVal1<6C>ľ<EFBFBD><C4BE><EFBFBD>Ϊ׼
dVal1.Round();
}
inline void operator *= (WDouble& dVal1,const WDouble& dVal2)
{
dVal1.m_dDblEnter *= dVal2.m_dDblEnter;
// <20><>dVal1<6C>ľ<EFBFBD><C4BE><EFBFBD>Ϊ׼
dVal1.Round();
}
inline void operator /= (WDouble& dVal1,const WDouble& dVal2)
{
dVal1.m_dDblEnter /= dVal2.m_dDblEnter;
// <20><>dVal1<6C>ľ<EFBFBD><C4BE><EFBFBD>Ϊ׼
dVal1.Round();
dVal1.m_dDblEnter = dVal1.m_dDbl;
}
inline WDouble operator + (const WDouble& dVal1,const WDouble& dVal2)
{
size_t nPrecision;
if(dVal1.m_nPrecision > dVal2.m_nPrecision)
nPrecision = dVal1.m_nPrecision;
else
nPrecision = dVal2.m_nPrecision;
WDouble dVal(dVal1.m_dDbl + dVal2.m_dDbl,nPrecision);
return dVal;
}
inline WDouble operator - (const WDouble& dVal1,const WDouble& dVal2)
{
size_t nPrecision;
if(dVal1.m_nPrecision > dVal2.m_nPrecision)
nPrecision = dVal1.m_nPrecision;
else
nPrecision = dVal2.m_nPrecision;
WDouble dVal(dVal1.m_dDbl - dVal2.m_dDbl,nPrecision);
return dVal;
}
inline WDouble operator * (const WDouble& dVal1,const WDouble& dVal2)
{
size_t nPrecision;
if(dVal1.m_nPrecision > dVal2.m_nPrecision)
nPrecision = dVal1.m_nPrecision;
else
nPrecision = dVal2.m_nPrecision;
WDouble dVal(dVal1.m_dDbl * dVal2.m_dDbl,nPrecision);
return dVal;
}
inline WDouble operator / (const WDouble& dVal1,const WDouble& dVal2)
{
size_t nPrecision;
if(dVal1.m_nPrecision > dVal2.m_nPrecision)
nPrecision = dVal1.m_nPrecision;
else
nPrecision = dVal2.m_nPrecision;
WDouble dVal(dVal1.m_dDbl / dVal2.m_dDbl,nPrecision);
return dVal;
}
inline ostream& operator << (ostream& os,const WDouble& object)
{
os << object.m_dDbl;
return os;
}
inline istream& operator >> (istream& is,WDouble& object)
{
double dVal;
is >> dVal;
if(is)
{
object.m_dDblEnter = dVal;
object.Round();
}
else
object = WDouble();
return is;
}
};