floating-point - 是否有x的浮点值,x-x == 0为false?

标签 floating-point floating-accuracy ieee-754

在大多数情况下,我知道应该使用一定范围内的值(abs(x-y)

// can the assertion be triggered?
float x = //?;
assert( x-x == 0 )

我的猜测是nan / inf可能是特殊情况,但我对简单值会发生什么更感兴趣。

编辑:

如果有人可以引用引用文献(IEEE浮点标准),我很乐意选择一个答案?

最佳答案

正如您所暗示的,inf - infNaN,不等于零。同样,NaN - NaNNaN。但是,对于任何有限的浮点数xx - 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/

相关文章:

java - 不使用 sqrt() 求平方根,精度达到 0.000001

c++ - 以 [0.5, 0.5, 0.5] 为中心的盒子大小为 1 的模拟是否有缺陷?

javascript - 为什么 JavaScript 在解析数字的末尾添加一个额外的非零数字

c - 为什么我需要 17 位有效数字(而不是 16 位)来表示 double ?

python - 将两个原始值转换为 32 位 IEEE float

c - sprintf 中的 %f 似乎在 TI 84 CE 在线 IDE 中不起作用

java - 意外的输出, float 和整数之间的混淆

floating-point - IEEE 24 位 float 的最小正值是多少?

c++ - IEEE Std 754 Floating-Point : let t := a - b, 标准是否保证 a == b + t?

C# 浮点舍入行为