[英]Why does the bit-width of the mantissa of a floating point represent twice as many numbers compared to an int?
有人告訴我,C++ 中的double
具有能夠安全准確地表示 [-(2 53 − 1), 2 53 − 1] 整數的尾數。
當尾數只有 52 位時,這怎么可能? 為什么int16
只能具有 [-32,768, +32,767] 或 [-2 15 , 2 15 -1] 的范圍,而int16
可以使用相同的東西來允許兩倍的可表示數字?
double
(64 位)的格式如下:
1 bit: sign
11 bits: exponent
52 bits: mantissa
我們只需要查看可以用尾數表示的正整數,因為符號位會為我們處理負整數。
天真地,使用 52 位,我們可以存儲從 0 到 2^52 - 1 的無符號整數。使用符號位,我們可以存儲從-2^52 - 1
到2^52 - 1
的整數。
但是,我們有一個可以使用的小技巧。 我們說我們的 integer 的第一個數字始終是 1,這給了我們一個額外的工作位。
要了解為什么會這樣,讓我們更深入地挖掘一下。
每個正數 integer 在其二進制表示中至少有一個1
。 因此,我們使用指數向左或向右移動尾數,直到我們在開始時得到 1。 一個例子在這里可能會有所幫助:
9,表示為無符號整數: 000...0001001
(點代表更多的0
s)。
另一種寫法: 1.001 * 2^3
。 ( 1.001
是二進制,而不是十進制。)
而且,我們同意永遠不要使用 0 作為第一位。 因此,即使我們可以將 9 寫為0.1001 * 2^4
或0.01001 * 2^5
,我們也不會。 我們會同意,當我們以這種格式寫出數字時,我們將始終確保使用指數“移位”位,直到我們以1
開頭。
所以,我們需要存儲得到9
的信息如下:
e: 3
i: 1.001
但是如果i
總是從1
開始,為什么每次都寫出來呢? 讓我們保留以下內容:
e: 3
i: 001
正是使用這些信息,我們可以將數字重構為: 1.i * 2^e == 9
。
當我們得到更大的數字時,我們的“ i
”會更大,可能最多使用 52 位,但我們實際上存儲了53
位信息,因為我們總是有前導1
。
最后說明:這不是存儲在雙精度數的指數和尾數中的內容,我已經簡化了一些事情來幫助解釋,但希望這有助於人們理解缺失位的來源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.