在午餐休息時間,我們開始討論double
值類型的精度。小數點後的雙精度
我的同事認爲,小數點後總是有15位。
在我看來一個也說不上來,因爲IEEE 754不作假設 這件事,這取決於在第一1
是二進制 表示。 (即小數點前面的數字的大小也是如此)
怎樣才能做出更合格的陳述?
在午餐休息時間,我們開始討論double
值類型的精度。小數點後的雙精度
我的同事認爲,小數點後總是有15位。
在我看來一個也說不上來,因爲IEEE 754不作假設 這件事,這取決於在第一1
是二進制 表示。 (即小數點前面的數字的大小也是如此)
怎樣才能做出更合格的陳述?
正如C# reference所述,在小數點之前或之後,精度爲15到16位數(取決於所表示的小數值)。
總之,你是對的,它取決於小數點前後的值。
例如:
12345678.1234567D
//接下來的位右移將得到圍捕1234567.12345678D
//接下來的位右移會得到四捨五入另外,試圖將double
作爲固定十進制值的值不是一個好主意。
只需指出它,這意味着_total_中的15位數字,而不僅僅是_小數點後面。 –
C#雙打根據IEEE 754具有53位的有效p(或尾數)和一個11位指數ë,其具有範圍-1022和1023之間,因此它們的值是
表示p * 2^e
有效數字在小數點前總是有一位數,所以小數部分的精度是固定的。另一方面,double中的小數點後面的數字也取決於它的指數;指數超過有效數的小數部分位數的數字本身沒有小數部分。
What Every Computer Scientist Should Know About Floating-Point Arithmetic可能是關於此主題最廣泛認可的出版物。
你倆都是錯的。正常的double
具有53位的位的精度。這大致相當於16位十進制數字,但考慮到double
值就像小數點一樣,導致混淆不清,最好避免。也就是說,你比你的同事更接近正確 - 精確度與所表示的價值相關;足夠大double
s有否精度的小數位。
例如,下一個大於4503599627370496.0
的雙倍數是4503599627370497.0
。
你用絕對術語還是科學記數法推理?你會如何考慮一個數字,如0.001e5? –
我們正在談論這一點。我的同事堅持在小數點後有15個地方。我的意見是,你有一個53位的尾數所有地方。但似乎有困難以合格的方式解釋這一點。 –
只是爲了更清楚一點:這尤其是C#的問題。如果內部C#表示不是IEEE 754,而是小數點後15位,這非常有趣。 –