MATLAB双算术

计算科学 matlab 误差估计 计算机算术
2021-12-01 04:54:51

这是一个经典问题,但我需要帮助来确定我所缺少的。

问题:在 MATLAB 中

(exp(1) + 10^12) - 10^12

给你一个等于 e 的双精度数,最多 5 个正确数字。但我以为是4。

一个有 exp(1) + 10^12 = 1.000000000002718e+12,其中 1.000000000002718 包含 16 位数字,即我们正在使用的精度。e 剩下的只有 2.718,但是 (exp(1) + 10^12) - 10^12 = 2.7182(我遗漏了最后一个小数点 2 之后的数字),这意味着我还保存了一个数字。

问题:多余的数字存储在哪里或如何存储?我知道无符号 64 位 IEEE 的最后 53 位用于舍入,这与我的问题有关吗?

2个回答

您可以使用dec2bin(typecast((exp(1) + 1e12) - 1e12, 'uint64'))来获得双精度浮点的二进制表示。

100000000000101101111110000101010001011000101000101100000000000 100001001101101000110101001010010100010000000000101100000000000 100000000000101101111110000000000000000000000000000000000000000 100000000000101101111100111011011001000101101000011100000000000 100000000000101101111101101111110100100001111111110010000000000

是的二进制表示

  • e
  • e + 1e12
  • (e + 1e12) - 1e12
  • 2.718
  • 2.7182

首先,我不能保证,但我怀疑 matlab 会返回一个有符号的双精度而不是无符号的,所以你可能只有 52 位可以使用。

然而,要真正解决这个问题,请考虑一个时针在 1 点钟停止的时钟。它的精确度很差,但如果你在 12.30 看它,它的精确度在半小时内。同样,双精度表示中的步仅用于告诉我们数学表示中的最大截断误差,实际准确度可以好得多。(1/2)52

作为更接近界限的具体示例,请将您的示例与 的结果进行比较。(π+1012)1012