【问题标题】:Is it possible to circumvent Matlab epsilon?是否有可能绕过Matlab epsilon?
【发布时间】:2015-09-26 00:42:08
【问题描述】:

我有两个几乎相同的数字数组。当我计算它们的差异时,我得到一个由一半非常小的数字组成的数组(大约为 1e-16),一半为 0。我几乎可以肯定这是由于舍入问题;即两个条目之间的差异小于 epsilon。

也就是说,我仍然想展示所有条目之间的差异(即使它们非常小)。有什么方法可以规避 Matlab 的 epsilon 容差吗?也许使用一些巧妙的数组缩放?

编辑:这是我的问题的一个例子。数组a 精确到15 位(从C 文件输出复制),而数组b 来自Matlab。取a 的一个元素,它正好是1.00002429399044。现在从中减去b 中的相应条目,显示1.00002429399044。根据 Matlab,它们之间的区别是 2.22044604925031e-16。这意味着b 条目中的数字必须多于显示的数字。

考虑相同的场景,a 的元素是1.00003105215213。现在这个数字与b显示1.00003105215213 的元素之间的差异正好是0。我很难相信在这种情况下存储的数字是完全相同的——也就是说,如果我可以在 Matlab 中显示更多数字,我希望看到这两个数字之间的差异。

【问题讨论】:

  • @HamtaroWarrior 仅更改显示,而不更改计算方式
  • @HH vpa 在 R2009b 中可用,但您需要符号工具箱
  • @AnderBiguri 我理解这个问题,我只是想知道是否有办法解决它。似乎至少有几个,但不幸的是我缺乏适当的资源。

标签: matlab rounding numerical


【解决方案1】:

如果您在 Matlab 中有两个 floating points numbers x 和 y,并且 xy 的计算结果为 0,这意味着 x 和 y 实际上相等:它们在内部由相同的 0-1 字符串表示长度为 64。减法运算没有“由于舍入问题”而丢失信息;相反,您要么一开始就没有信息,要么在减法之前丢失了信息。

如果您怀疑 x 和 y 不应该相等,您必须查看之前发生的情况,因为它们是计算出来的。知道最终目标是将 x 与 y 进行比较,可能可以重新组织计算。

简单的例子:如果我想为一些大的 x 计算 y=sqrt(x^2+1),那么这个公式就可以很好地写出来。但如果我的最终目标是将结果与 x 进行比较,即考虑 sqrt(x^2+1)-x,我将采用不同的方式,使用 sqrt(x^2+1)- x = 1/(sqrt(x^2+1)+x)。

【讨论】:

  • 我认为这不太对。它们彼此在 epsilon 之内,因此它们之间没有浮点数,但它们不必完全相同。我在我的问题中添加了一个示例来说明我的意思。
  • 关于您的编辑:是的,您可以获得各种人类可读的输出,但它们都来自 Matlab 存储的相同 64 位 (IEEE 754 standard)。通过使用fprintf('%bx', your_number),您可以确切地看到 Matlab 的功能:这会将为简洁而编码的 64 位输出为 16 个字符的十六进制字符串。如果fprintf('%bx', x) 给出与fprintf('%bx', y) 相同的字符串,就是这样——x 和y 是相同的。
  • @1999 或者只使用format hex 来获得所有位的一般显示,而不需要对所有内容使用fprintf
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 2015-06-25
相关资源
最近更新 更多