是否有可能规避Matlab epsilon?

时间:2015-07-08 08:12:59

标签: matlab rounding numerical

我有两个几乎相同的数字数组。当我拿出他们的不同之处时,我会得到一个非常小数字的数组(大约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中显示更多的数字,我希望看到两个数字之间的差异。

1 个答案:

答案 0 :(得分:0)

如果在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)。