Floating point Wolfram alpha和浮点运算(显著性损失)

Floating point Wolfram alpha和浮点运算(显著性损失),floating-point,precision,floating-accuracy,numerical-analysis,Floating Point,Precision,Floating Accuracy,Numerical Analysis,我在学习浮点算术。假设我们是双精度的。我们知道,当我们减去两个“几乎”大小相同的数字时,相对误差很大 例如,在MatLab命令窗口中,如果我计算 2.0000001-2.0 我获得9.9999998363421E-08 相对误差为1.63657882716964e-09,不容忽视 但如果我在Wolfram alpha中(或使用笔记本电脑的计算器)这样做,我实际上得到了正确的结果,即1e-7 所以,我的问题是:为什么?我认为MatLab和我笔记本电脑的计算器都以同样的方式使用浮点运算有两种可能的原

我在学习浮点算术。假设我们是双精度的。我们知道,当我们减去两个“几乎”大小相同的数字时,相对误差很大

例如,在MatLab命令窗口中,如果我计算

2.0000001-2.0

我获得
9.9999998363421E-08

相对误差为1.63657882716964e-09,不容忽视

但如果我在Wolfram alpha中(或使用笔记本电脑的计算器)这样做,我实际上得到了正确的结果,即
1e-7


所以,我的问题是:为什么?我认为MatLab和我笔记本电脑的计算器都以同样的方式使用浮点运算

有两种可能的原因导致在减去2.0000001-2.0时精确看到1e-7

其一是许多系统在输出时舍入到合理的位数。IEEE 64位二进制文件2.0000001-2.0到十进制的精确转换为9.99999983632112757847644388675689697265625E-8。一些系统舍入到有限数量的有效数字,并可能将其打印为1e-7。另一方面,例如Java,默认情况下提供足够的数字来区分原始值和任何其他双精度值,并打印9.999999898363411E-8


另一个可能的原因是,如果算术是以十进制进行的,在这种情况下,实数2.0000001、2和它们的差都是可以精确表示的,因为它们都是十进制分数。你需要计算1/3这样的数值才能看到舍入误差。

matlab与wolfram alpha有什么关系?我认为wolfram alpha使用的“引擎盖下”并没有公开记录,但他们可能使用某种形式的任意精度数学。谢谢你的回答。在你看来,我笔记本电脑的计算器是否可能使用十进制的算术?这看起来有点奇怪me@lukk很难区分。也许可以尝试一些需要以十进制进行舍入的计算,例如sqrt(2)、1/3和2/3。这可能会提供一些线索。首先,我看到它使用单精度,因为如果我使用2/3,我会得到066667。因此,由于6>(10)/2=5,那么最后一位数字四舍五入为6+1=7,因此它似乎使用了十进制算法。这是确认我的嫌疑犯的好方法吗?@lukk它没有使用32位IEEE 754。2.0f/3.0f的精确值为0.6666686534881591796875。四舍五入到显示的小数点后9位,您将看到0.66687。现在请尝试
1+1e-9-1
。如果它在做十进制算术,我希望是1e-9。如果它执行IEEE 64位算术,我希望1.000000082740371E-9,四舍五入到显示宽度。