簡體   English   中英

為什么浮點尾數的位寬表示的數字是整數的兩倍?

[英]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 - 12^52 - 1的整數。

但是,我們有一個可以使用的小技巧。 我們說我們的 integer 的第一個數字始終是 1,這給了我們一個額外的工作位。

要了解為什么會這樣,讓我們更深入地挖掘一下。

每個正數 integer 在其二進制表示中至少有一個1 因此,我們使用指數向左或向右移動尾數,直到我們在開始時得到 1。 一個例子在這里可能會有所幫助:

9,表示為無符號整數: 000...0001001 (點代表更多的0 s)。

另一種寫法: 1.001 * 2^3 1.001是二進制,而不是十進制。)

而且,我們同意永遠不要使用 0 作為第一位。 因此,即使我們可以將 9 寫為0.1001 * 2^40.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM