在大多数情况下,我知道应该使用一定范围内的值(abs(x-y)// can the assertion be triggered?
float x = //?;
assert( x-x == 0 )
我的猜测是nan / inf可能是特殊情况,但我对简单值会发生什么更感兴趣。
编辑:
如果有人可以引用引用文献(IEEE浮点标准),我很乐意选择一个答案?
最佳答案
正如您所暗示的,inf - inf
是NaN
,不等于零。同样,NaN - NaN
是NaN
。但是,对于任何有限的浮点数x
,x - x == 0.0
都是正确的(取决于舍入模式,x - x
的结果可能为负零,但在浮点算术中,负零与0.0
相等)。
编辑:要提供清晰的标准引用有些棘手,因为这是IEEE-754标准中列出的规则的新兴属性。具体来说,它是根据第5条中定义的运算正确取整的要求得出的。减法就是这样的运算(第5.4.1节“算术运算”),并且x - x
的正确取整结果是适当符号的零(第6.3节,第3段):
When the sum of two operands with opposite signs (or the difference of two operands with like signs) is exactly zero, the sign of that sum (or difference) shall be +0 in all rounding-direction attributes except roundTowardNegative; under that attribute, the sign of an exact zero sum (or difference) shall be −0.
因此
x - x
的结果必须是+/- 0
,因此必须与0.0
相等(第5.11节,第2段):Comparisons shall ignore the sign of zero.
进一步编辑:这并不是说错误的编译器不会导致断言触发。您的问题不明确;没有有限的浮点数
x
,使得x - x == 0
为false。但是,这不是您发布的代码所检查的内容。它检查C风格语言中的某个表达式是否可以计算为非零值;特别是在某些平台上,通过某些(构想较深的)编译器优化,该表达式中变量x
的两个实例可能具有不同的值,从而导致断言失败(尤其是如果x
是某些计算的结果,而不是一个恒定的,可表示的值)。这是那些平台上的数字模型中的错误,但这并不意味着它不可能发生。
关于floating-point - 是否有x的浮点值,x-x == 0为false?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2686644/