防止arithmetic overflow和underflow的單一最有效的做法是什麼?防止算術上溢和下溢的單一最有效的做法
浮現在腦海中的一些例子是:基於有效輸入
- 測試採用正規方法
- 使用不變量使用的語言特性和庫在運行時
- 檢測(此範圍
- 驗證不妨礙它)
防止arithmetic overflow和underflow的單一最有效的做法是什麼?防止算術上溢和下溢的單一最有效的做法
浮現在腦海中的一些例子是:基於有效輸入
一種可能性是使用任意si不會溢出/下溢的整數。否則,如果這是你真正關心的事情,並且如果你的語言允許,寫一個類似於整數的包裝類,但檢查每個操作是否溢出。你甚至可以讓它對調試版本進行檢查,並且對發佈版本進行優化。在像C++這樣的語言中,你可以這樣做,它的行爲幾乎和發佈版本的整數類似,但對於調試版本,你可以得到完整的運行時檢查。
class CheckedInt
{
private:
int Value;
public:
// Constructor
CheckedInt(int src) : Value(src) {}
// Conversions back to int
operator int&() { return Value; }
operator const int &() const { return Value; }
// Operators
CheckedInt operator+(CheckedInt rhs) const
{
if (rhs.Value < 0 && rhs.Value + Value > Value)
throw OverflowException();
if (rhs.Value > 0 && rhs.Value + Value < Value)
throw OverflowException();
return CheckedInt(rhs.Value + Value);
}
// Lots more operators...
};
編輯:
原來有人doing this already for C++ - 目前實施的重點是爲Visual Studio,但看起來他們得到了海灣合作委員會的支持。
我寫了很多測試代碼來對我的代碼進行範圍/有效性檢查。這往往能夠捕捉到這些類型的情況 - 這絕對有助於我編寫更多防彈代碼。
使用高精度浮點數,如long double。
我認爲您在列表中缺少一個非常重要的選項:爲作業選擇正確的編程語言。有許多編程語言沒有這些問題,因爲它們沒有固定大小的整數。
當選擇使用哪種語言而不是整數大小時,還有更重要的考慮因素。如果您不知道該值是否在界限內,則只需檢查輸入;如果情況非常罕見,則使用異常處理。
檢查不一致性的包裝在許多情況下都有意義。如果對兩個或多個整數的加法操作(即加法或乘法)導致的值小於操作數,那麼你就知道出了問題。每一個加法運算應遵循,
if (sum < operand1 || sum < operand2)
omg_error();
同樣應該在邏輯上導致較小的值,應檢查,看它是否被意外embiggin'd任何操作。
浮點(具有任何精度)引入了更難的一類問題,即精度損失。即`(x + 1.0)-x!= 1`。使用'長雙'只會降低頻率和幅度。 – MSalters 2009-09-14 10:19:07