Matlab 如何存储只有 64 位的这么大的数字?

How does Matlab store this large of a number with only 64 bits?

提问人:user56202 提问时间:6/8/2021 更新时间:6/8/2021 访问量:170

问:

双精度(即 64 位)浮点运算中的最大数字是(基点后有 51 个)。此数字小于 。因此,当我分配 时,我希望它将存储为 。然而,事实并非如此。在交互式控制台中呼叫将显示 。我能想到的唯一解释是 Matlab 使用超过 64 位来存储 .但是快速检查一下,就会发现它存储在 8 个字节中。1.111...110 x 2^(512)12 x 2^(512) == 2^(513) == 8^(171) < 10^(171)x = 10^(171)xInfx1.0000e+171xwhos xx

事实上,其中最大的功率不会按原样存储.10Inf10^308

有人可以解释一下这里发生了什么吗?

MATLAB 浮点 精度

评论


答:

1赞 user56202 6/8/2021 #1

对不起,我在这里犯了一个简单的错误。在 64 位算术中,11 位用于对指数进行编码。因此,我们有可能的指数,所以它们的范围是 到 ,而不是像我想的那样从 to 到。因此,64 位算术中的最大数字是 $1.111...110 x 2^(1024)$,这实际上是(指数有 3 位有效数字),证实了我的实验结果。2^(11) = 2048-10231024-51151210^(308.6)

评论

1赞 Pursuit 6/8/2021
Matlab 可以帮助您进行其中一些探索。例如,请参见 和 。realmaxreammineps
0赞 user56202 6/8/2021
@Pursuit 有趣,谢谢!您是否知道任何专为理解浮点运算而设计的命令包或集合?
0赞 Eric Postpischil 6/8/2021
指数值范围为 −1022 至 +1023。指数字段值 0 和 2047 保留用于次正态值、NaN 和无穷大。最大可表示的有限数是 (2−2^−53)•2^1023 = 2^1024−2^971,约为 10^308.25。
0赞 user56202 6/8/2021
@EricPostpischil 感谢您的澄清。我的印象是只有(63's)代表。你是说任何正尾数,当与指数字段值 结合时,代表 ?这似乎是浪费了完美的数字。Inf01111...1112047Inf2^(52)-1
0赞 Eric Postpischil 6/9/2021
@user56202:浮点表示的分数部分的首选术语是“有效”,而不是“尾数”。“尾数”是一个古老的词,表示对数的小数部分。有效是线性的。尾数是对数的。IEEE-754 二进制浮点编码的低位是尾随有效字段。在它与前导位组合之前,这不是一个有效位,该前导位通过指数场进行编码。当指数字段全部为 1 时,没有有效数:如果尾随的有效数字段全部为 0,则编码表示无穷大......