[英]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.