在遇到很多關於double類型變量的問題之後,像測試相等和除零等問題,我想到讓一個類處理double值並嘗試無縫切換我們使用的內在雙精度定期與新班上課。儘管如此,它並不適合。這裏是我的類:C++中的double類class
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例如()函數調用的函數,它預計雙。有沒有辦法讓我的類對象在需要時衰減到內在的雙倍?謝謝。
p.s.我的課必須與現有代碼無縫配合。不能改變這一點。我所能做的就是搜索並用HDouble替換double。
覆蓋演員:http://www.cplusplus.com/forum/general/25434/ – TJD
類似這樣的類沒有機會無縫地代替double,因爲它打破了數學平等的基本規則:你的==不再是可傳遞的。當你看到'a == b'和'b == c'時,你不能暗示'a == c'。不幸的是,這是一切都崩潰的地方:沒有可靠的'=='運算符的類沒有用處。這個錯誤既是常見的,又是舊的:我記得在編寫Algol編譯器的過程中,讀到了Dijkstra關於犯同樣錯誤的說法。 – dasblinkenlight
值得一提的是(未來,也許)自從C++ 11以來,您可以製作明確的轉換運算符,以避免發生隱式轉換。 – chris