2012-08-23 97 views
5

在午餐休息時間,我們開始討論double值類型的精度。小數點後的雙精度

我的同事認爲,小數點後總是有15位。

在我看來一個也說不上來,因爲IEEE 754不作假設 這件事,這取決於在第一1是二進制 表示。 (即小數點前面的數字的大小也是如此)

怎樣才能做出更合格的陳述?

+0

你用絕對術語還是科學記數法推理?你會如何考慮一個數字,如0.001e5? –

+0

我們正在談論這一點。我的同事堅持在小數點後有15個地方。我的意見是,你有一個53位的尾數所有地方。但似乎有困難以合格的方式解釋這一點。 –

+0

只是爲了更清楚一點:這尤其是C#的問題。如果內部C#表示不是IEEE 754,而是小數點後15位,這非常有趣。 –

回答

3

正如C# reference所述,在小數點之前或之後,精度爲15到16位數(取決於所表示的小數值)。

總之,你是對的,它取決於小數點前後的值

例如:

  • 12345678.1234567D //接下來的位右移將得到圍捕
  • 1234567.12345678D //接下來的位右移會得到四捨五入

全樣本: http://ideone.com/eXvz3

另外,試圖將double作爲固定十進制值的值不是一個好主意。

+2

只需指出它,這意味着_total_中的15位數字,而不僅僅是_小數點後面。 –

-1

C#雙打根據IEEE 754具有53位的有效p(或尾數)和一個11位指數ë,其具有範圍-1022和1023之間,因此它們的值是

表示
p * 2^e 

有效數字在小數點前總是有一位數,所以小數部分的精度是固定的。另一方面,double中的小數點後面的數字也取決於它的指數;指數超過有效數的小數部分位數的數字本身沒有小數部分。

What Every Computer Scientist Should Know About Floating-Point Arithmetic可能是關於此主題最廣泛認可的出版物。

4

你倆都是錯的。正常的double具有53位的的精度。這大致相當於16位十進制數字,但考慮到double值就像小數點一樣,導致混淆不清,最好避免。也就是說,你比你的同事更接近正確 - 精確度與所表示的價值相關;足夠大double s有精度的小數位。

例如,下一個大於4503599627370496.0的雙倍數是4503599627370497.0