並非所有的十進制數都可以用二進制浮點數精確表示。用十進制數表示的二進制浮點數
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
有兩個原因,一個真正的數字可能不完全 表示爲一個浮點數。最常見的情況是用十進制數字0.1表示的 。儘管它具有有限的 十進制表示,但在二進制中它具有無限重複 表示形式。
另一種方式呢?如果足夠的數字被使用,每個單獨的浮點數都可以用十進制數表示嗎?
並非所有的十進制數都可以用二進制浮點數精確表示。用十進制數表示的二進制浮點數
http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
有兩個原因,一個真正的數字可能不完全 表示爲一個浮點數。最常見的情況是用十進制數字0.1表示的 。儘管它具有有限的 十進制表示,但在二進制中它具有無限重複 表示形式。
另一種方式呢?如果足夠的數字被使用,每個單獨的浮點數都可以用十進制數表示嗎?
是的,如果使用了足夠的數字,那麼每個有限的IEEE 754浮點數都可以用十進制數表示。
精度的每個附加二進制數字都至多需要一個附加的十進制數字來精確表示。
例如:
0.1b -> 0.5
0.01b -> 0.25
0.11b -> 0.75
0.001b -> 0.125
1和2之間的雙精度(binary64)號碼只需要52個十進制數字之後被精確表示的點:
#include <stdio.h>
int main(void) {
printf("%.55f\n", 1.1);
}
結果:
1.1000000000000000888178419700125232338905334472656250000
在上面顯示的結尾處顯示四個之後,它全部爲零。 1.100000000000000088817841970012523233890533447265625是距離11/10最近的double的確切值。
正如在下面的評論中指出的那樣,負指數的每個額外的單位數量還需要一個額外的十進制數字來精確表示。但是大數量的負指數在它們的小數表示中具有前導零。最小的次正常數在點後面有1022 + 52個十進制數字,但這些數字的第一個近1022 * log (2)將爲零。
「..如果使用了足夠的數字」 - 多少是1/2?4? – usr2564301
@Jongware負指數的每個額外的單位數量還需要一個額外的十進制數字來精確表示。我將數學作爲練習給讀者1 /(2^24),但如果它非常接近24,我不會感到驚訝。除非你的意思是不計算前導零,否則你需要減去24 * log10(2)或類似的東西。 –
@Jongware 1 /(2^24)爲0.000000059604644775390625,小數點後有24位數,其中7位是前導零。 –
@harold一些雙精度數字需要大約750個十進制數字(或多或少爲52 + 1022 *(1 - log10(2))) –
@harold當我說52 + 1022 *(1 - log10(2)),但是如果我想對它們進行計數,它將是52 + 1022.不計算前導零很容易:有效數字中的每個二進制數字和負指數的每個單位都需要一個十進制數字。 –
@harold這個人說767.「1 - log10(2)」是粗略的近似值,而不是精確的科學。 http://stackoverflow.com/a/17245451/139746 –