你們看到的是一個事實,即實數(讀浮點)造成無法完美表達二進制計算機的精度和準確性。這是生活中的事實。相反,電腦近似該值並以定義的格式將其存儲在內存中。
對於大多數現代化機器(包括運行MSVC Express的任何機器),此格式爲IEEE 754。長話短說,這是IEEE 754中如何存儲實數:存在一個符號位,8個指數位和23個小數位(對於float
數據類型 - doubles
相應地使用了更多位,但格式相同)。正因爲如此,你永遠無法達到完美的精度和準確性。幸運的是,對於包括關鍵財務系統和科學系統在內的幾乎任何應用,您都可以獲得足夠的準確度和精度
爲了能夠在代碼中使用浮點數,您不需要了解有關IEEE754的所有信息。但也有你必須知道一些事情:
1)你永遠不能比較兩個浮點值,因爲在浮點calulation &存儲固有的舍入誤差的平等。相反,你必須這樣做:
double d = 0.2;
double compare = 0.000000001;
double d2 = something;
if((d - d2 < compare) && (d2 - d < compare))
{
// numbers are equal
}
2)舍入錯誤複合。您對浮點值執行操作的次數越多,精度的損失就越大。
3)您不能添加兩個幅度大不相同的浮點。例如,您不能添加1.5x10^30和1.5x10^-30,並期望60位精度。
歡迎浮點。 – GManNickG 2010-03-18 19:05:44
這個問題(或其變體)每隔幾天在這裏出現。絕對是某種重複! – spender 2010-03-18 19:10:37