正如this example所暗示:
0.1 + 0.1 + 0.1 == 0.3
在存储0.1
时由于精度问题而给出了令人惊讶的错误结果。
然而,
1 + 1 + 1 == 3
按预期评估为true。请注意,这里仍存在浮点数比较的问题。正如评论中所指出的,除非另有说明,否则默认数值数据类型为double。
我的问题是,如果a + b + c + ...= T
,a
,b
,c
,...,T
都是整数,则是评估值的
a + b + c + ... == T
总是如此?
有哪些其他方法可以放宽a
,b
,c
,...,T
为整数的条件并仍保持上述事实声明?
正如在one answer中有用地指出的那样,在评估的任何一点遇到的任何类型的溢出都会导致它被评估为假:
A = realmax('double')
A - A + A == A % evaluates to true
A + A - A == A % evaluates to false
因此,出于我原始问题的目的,假设在评估表达式所需的任何阶段都没有遇到溢出问题。
答案 0 :(得分:4)
如果使用固定大小的数据类型表示整数,则可以表示数字的大小(数量级)存在限制。因此,如果计算超过该限制(称为溢出的条件),则结果将不正确。
答案 1 :(得分:3)
如果考虑如何用浮点表示法表示整数,只要没有表示错误,就不会有相等比较的问题。对于"小"整数它永远不是一个问题,因为你有足够的位用于尾数,它们可以准确表示。如果您尝试添加非常(非常)大整数,则可能会出现问题:
>> 2^50 == 2^50+1
ans =
0
虽然:
>> 2^53 == 2^53+1
ans =
1
这是Scott Hunter所说的溢出。查找IEEE标准754以了解有关浮点数表示的更多信息。