【问题标题】:Wolfram alpha and floating point arithmetic (loss of significance)Wolfram alpha 和浮点运算(显着性损失)
【发布时间】:2020-06-17 09:27:59
【问题描述】:

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

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

2.0000001-2.0

我得到9.99999998363421e-08

并且有一个不可忽略的相对误差 errRel = 1.63657882716964e-09

但如果我在 Wolfram alpha 中(或使用笔记本电脑的计算器)执行此操作,我实际上会得到正确的结果,即 1e-7

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

【问题讨论】:

  • matlab 和 wolfram alpha 有什么关系?
  • 我认为没有公开记录 wolfram-alpha 在“幕后”使用了什么,但他们可能使用某种形式的任意精度数学。

标签: floating-point precision floating-accuracy numerical-analysis


【解决方案1】:

在减去 2.0000001-2.0 时正好看到 1e-7 有两个可能的原因。

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

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

【讨论】:

  • 感谢您的回答。在您看来,我笔记本电脑的计算器是否有可能使用十进制算术?我觉得有点奇怪
  • @lukk 没有简单的区分方法。也许尝试一些需要四舍五入的十进制计算,例如 sqrt(2)、1/3 和 2/3。这可能会提供一些线索。
  • 首先,我看到它使用单精度,因为如果我执行 2/3,我会得到 0,666666667。所以,由于 6 > (10)/2=5,那么最后一位被四舍五入为 6+1 = 7,因此它似乎使用了十进制算法。这是确认我的嫌疑人的好方法吗?
  • @lukk 没有使用 32 位 IEEE 754。2.0f/3.0f 的准确值为 0.666666686534881591796875。四舍五入到显示的小数点后 9 位,您会看到 0.666666687。
  • 现在试试1+1e-9-1。如果它在做十进制算术,我会期望 1e-9。如果它正在执行 IEEE 64 位算术,我预计 1.000000082740371E-9,四舍五入到显示宽度。
猜你喜欢
  • 1970-01-01
  • 2014-02-08
  • 1970-01-01
  • 2016-06-14
  • 2019-01-21
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2015-12-20
相关资源
最近更新 更多