Excel-为什么两个相等的整数有非零差?

Excel-为什么两个相等的整数有非零差?,excel,floating-point,precision,Excel,Floating Point,Precision,我在一个单元格中有=2*10^15,计算结果为20000000000,在另一个单元格中有=2+2*10^15,计算结果为20000000000,这很好,因为精度只有15位。但是当我从一个减去另一个时,我得到了2,我不知道它从哪里来。据我所知,2*10^15有一个精确的二进制表示形式,所以我会认为在向它添加2时,它只是“被删除”。但我的理解似乎不正确 实际上,据我所知,2E+15的二进制表示在与2的幂对应的位置上有1等于{50,49,48,44,43,41,39,38,37,36,35,34,32

我在一个单元格中有
=2*10^15
,计算结果为
20000000000
,在另一个单元格中有
=2+2*10^15
,计算结果为
20000000000
,这很好,因为精度只有15位。但是当我从一个减去另一个时,我得到了
2
,我不知道它从哪里来。据我所知,
2*10^15
有一个精确的二进制表示形式,所以我会认为在向它添加
2
时,它只是“被删除”。但我的理解似乎不正确

实际上,据我所知,
2E+15
的二进制表示在与
2
的幂对应的位置上有
1
等于
{50,49,48,44,43,41,39,38,37,36,35,34,32,30,27,24,23,19,18,16}
,,那么为什么我们不能在power
1
对应的位置添加另一位,并精确表示
2+2E+15

此外,如果在Excel电子表格中添加
2
而不是
1
,则
2*10^15
1+2*10^15
之间的差异是
0
,但如果在Excel VBA中进行相同的计算,则返回1。那是怎么回事

我读过(好几次)“每一位计算机科学家都应该知道的浮点运算”,但那里的讨论似乎集中在小数而不是整数上,或者我就是不明白

添加1

我记得不久前我在VBA中编写了一个函数,以获取Excel存储的数字的二进制表示形式(该函数可以在此处找到) )。因此,如果我将该函数应用于
2+2E+15
,它确实会返回一个尾数最后第四位为
1
的二进制文件(但不确定为什么是第四位),当该函数应用于
2E+15
时,该二进制文件不存在,因此,Excel似乎只是选择显示精度为15位的数字,即使底层存储的浮点数具有更高的精度

添加2

结果表明,
2+2E+15
尾数中的额外位位于第四位(而不是第二位)的原因是,尾数通过删除前导(最左侧)位(因为它始终为1)并通过向左移位(在尾数末尾增加20)将尾数长度调整为52位来“正常化”“简单”二进制表示法,以便
1110-0011-0101-1111-1010-1001-0011-0001-1010-0000-0000-010
变成
1100-0110-1011-1111-0101-0010-0110-0011-0100-0000-0000-1000

似乎由于尾数的这种标准化,浮点双精度表示法的精度实际上是18位小数,例如,数字
1.75+2E+15
可以用尾数
1100-0110-1011-1111-0101-0010-0110-0011-0100-0000-0000-0111
精确表示


只需要弄清楚指数是怎么回事…有一种叫做“偏置”的方法正在对它进行处理…

Excel将数字存储为双精度,总共使用64位。一位是符号,11位是从-1024到1024的指数(以2为基数),其余52位是分数

使用此方法,一个数字可以转换为双精度并再次转换并保证不变的有效数字的最大数量为15。对于16和17个有效数字,这仅适用于某些数字。我假设这就是为什么excel在工作表中只显示15个有效数字的数据。请注意根据规格,Excel将以比其显示更高的精度存储公式结果值[

现在理论上,我们应该能够精确地表示2^53=9007199254740992的整数。但是,Excel似乎只存储精确到2^50=1125899906842624的整数。尝试从一减去这个数字加上这个数字,得到零。任何小于这个数的,都会得到预期的一个。然后尝试2^51=2251799813,685248,然后从2或3中减去这个数字加上这个数字,你得到零。但是如果你从4中减去这个数字加上这个数字,你得到4。依此类推

请注意,2E+15的值介于这两个值之间,因此不会出现1的差异,但任何更大的差异都会出现

本文对此进行了明确解释: 所以,我做了一些研究,因为我对这个问题很感兴趣。虽然我不能保证这个答案绝对正确,但它很可能是我们最接近正确答案的答案(除非一些专家介入)


我将试着剖析这个问题:

我在一个计算为20000000000的单元格中有=2*10^15 我在另一个单元格中有=2+2*10^15,它的计算结果也是 20000000000000000,这很好,因为精度只有15 但当我从一个数字中减去另一个,我得到2,这是 我不明白它从哪里来。据我所知2*10^15 一个精确的二进制表示,所以我会认为 再加上2,它就“掉了”。但我的 理解是错误的

我认为在我们继续之前,我认为重要的是要声明,Excel(或其他MS产品)在浮点精度方面是出了名的不足。这里必须说明一些不准确之处

此外,这实际上是其中一种情况,显示会产生误导。屏幕上显示的数字实际上与您计算的数字不同。我的意思是,在您的情况下,2E+15和2E+15虽然显示相同,但不一定是相同的数字!(听起来很奇怪。)它们只是显示为