Matlab中1 + 1 == 2总是为真吗?

时间:2016-05-05 01:22:26

标签: matlab double precision

正如this example所暗示:

0.1 + 0.1 + 0.1 == 0.3

在存储0.1时由于精度问题而给出了令人惊讶的错误结果。

然而,

1 + 1 + 1 == 3

按预期评估为true。请注意,这里仍存在浮点数比较的问题。正如评论中所指出的,除非另有说明,否则默认数值数据类型为double。

我的问题是,如果a + b + c + ...= Tabc,...,T都是整数,则是评估值的

a + b + c + ... == T
总是如此?

有哪些其他方法可以放宽abc,...,T为整数的条件并仍保持上述事实声明?

正如在one answer中有用地指出的那样,在评估的任何一点遇到的任何类型的溢出都会导致它被评估为假:

A = realmax('double')
A - A + A == A % evaluates to true
A + A - A == A % evaluates to false

因此,出于我原始问题的目的,假设在评估表达式所需的任何阶段都没有遇到溢出问题。

2 个答案:

答案 0 :(得分:4)

如果使用固定大小的数据类型表示整数,则可以表示数字的大小(数量级)存在限制。因此,如果计算超过该限制(称为溢出的条件),则结果将不正确。

答案 1 :(得分:3)

如果考虑如何用浮点表示法表示整数,只要没有表示错误,就不会有相等比较的问题。对于"小"整数它永远不是一个问题,因为你有足够的位用于尾数,它们可以准确表示。如果您尝试添加非常(非常)大整数,则可能会出现问题:

>> 2^50 == 2^50+1

ans =

     0

虽然:

>> 2^53 == 2^53+1

ans =

     1

这是Scott Hunter所说的溢出。查找IEEE标准754以了解有关浮点数表示的更多信息。