在遇到了很多关于双精度类型变量的问题,比如测试相等和除以零等问题之后,我想到了创建一个类来处理双精度值,并尝试将我们经常使用的内在双精度值与新类无缝切换。但它并不完全适合。这是我的课:
class HDouble
{
//private:
public:
double dValue;
static const double dEpsilon;
HDouble()
{
dValue = 0.0;
}
HDouble(double OtherValue)
{
if (IsNaN(OtherValue))
{
assert(0);
}
dValue = OtherValue;
}
const HDouble& operator=(const HDouble& OtherValue)
{
if (this == &OtherValue) // Same object?
return *this;
if (IsNaN(OtherValue.dValue))
{
assert(0);
}
dValue = OtherValue.dValue;
return *this;
}
const HDouble& operator=(const double& OtherValue)
{
dValue = OtherValue;
return *this;
}
bool operator==(const HDouble& OtherValue)
{
return (abs(dValue - OtherValue.dValue) < dEpsilon);
}
//////////////////////////////////////////////////////////////////////////
const HDouble& operator++()
{
dValue++;
return *this;
}
const HDouble& operator++(int dummy)
{
dValue++;
return *this;
}
const HDouble& operator--()
{
dValue--;
return *this;
}
const HDouble& operator--(int dummy)
{
dValue--;
return *this;
}
//////////////////////////////////////////////////////////////////////////
HDouble operator*(const HDouble& OtherValue)
{
HDouble Result = *this;
Result *= OtherValue;
return Result;
}
HDouble operator*(const double& OtherValue)
{
HDouble Result = *this;
Result *= OtherValue;
return Result;
}
HDouble operator/(const HDouble& OtherValue)
{
HDouble Result = *this;
Result /= OtherValue;
return Result;
}
HDouble operator/(const double& OtherValue)
{
HDouble Result = *this;
Result /= OtherValue;
return Result;
}
HDouble operator+(const HDouble& OtherValue)
{
HDouble Result = *this;
Result += OtherValue;
return Result;
}
HDouble operator+(const double& OtherValue)
{
HDouble Result = *this;
Result += OtherValue;
return Result;
}
HDouble operator-(const HDouble& OtherValue)
{
HDouble Result = *this;
Result -= OtherValue;
return Result;
}
HDouble operator-(const double& OtherValue)
{
HDouble Result = *this;
Result -= OtherValue;
return Result;
}
//////////////////////////////////////////////////////////////////////////
HDouble& operator*=(const double& OtherValue)
{
dValue *= OtherValue;
return *this;
}
HDouble& operator*=(const HDouble& OtherValue)
{
dValue *= OtherValue.dValue;
return *this;
}
HDouble& operator+=(const HDouble& OtherValue)
{
dValue += OtherValue.dValue;
return *this;
}
HDouble& operator+=(const double& OtherValue)
{
dValue += OtherValue;
return *this;
}
HDouble& operator-=(const double& OtherValue)
{
dValue -= OtherValue;
return *this;
}
HDouble& operator-=(const HDouble& OtherValue)
{
dValue -= OtherValue.dValue;
return *this;
}
HDouble& operator/=(const double& OtherValue)
{
dValue /= OtherValue;
return *this;
}
HDouble& operator/=(const HDouble& OtherValue)
{
dValue /= OtherValue.dValue;
return *this;
}
//////////////////////////////////////////////////////////////////////////
inline bool IsNaN(double d)
{
if (!(d >= DBL_MIN && d <= DBL_MAX))
{
return true;
}
else
return false;
}
};
一个问题就像一个已经存在的函数调用 cos() 函数,它需要一个双精度值。有没有办法让我的类对象在需要时衰减到内在的双倍?谢谢。
ps 我的课程必须与现有代码无缝匹配。不能改变这一点。我所能做的就是用HDouble搜索并替换double。