2010-03-18 66 views
0

我使用Visual C++ 2008 Express Edition的,當我調試代碼:在Visual C double類型的數值精度++ 2008 Express的調試

double x = 0.2; 

我在X 0.20000000000000001

但調試提示參見:

typedef numeric_limits<double> double_limit; 
int a = double_limit::digits10 

給我:A = 15

爲什麼會導致調試較長ŧ正常的C + +精度? 基於這個奇怪的精度是什麼?

我的CPU是英特爾酷睿2雙核T7100

+6

歡迎浮點。 – GManNickG 2010-03-18 19:05:44

+1

這個問題(或其變體)每隔幾天在這裏出現。絕對是某種重複! – spender 2010-03-18 19:10:37

回答

1

你們看到的是一個事實,即實數(讀浮點)造成無法完美表達二進制計算機的精度和準確性。這是生活中的事實。相反,電腦近似該值並以定義的格式將其存儲在內存中。

對於大多數現代化機器(包括運行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位精度。

0

雙字面值0.2給出的確切值是0.200000000000000011102230246251565404236316680908203125。

大部分功能是有一定量的小數位數後削減產量翻番,這就是爲什麼你是0.2實際上產生0.2

這裏是我得到了確切的價值觀念,:

public static void main(String[] args) 
{ 
    System.out.println(new java.math.BigDecimal(0.2)); 
}