浮点数:如果 a > b 那么 a - b > 0 是真的吗?

Zha*_*Shi 2 c++ floating-point precision

在 C++ 中,对于两个双打 a 和 b,如果 a > b,那么 a - b > 0 是真的吗?假设a,b不是Nan,只是普通数字

Eri*_*hil 7

不,不仅仅是 C++ 标准的要求。C++ 允许实现使用浮点类型而不支持次正规数。在这种类型中,您可以有a等于 1.0001 2 •2 m,其中m是最小法向指数,并且b等于 1.0000 2 •2 m。然后,a > b但 的确切值a-b无法表示(它将低于正常值),因此计算结果为零。

这不会发生在支持次正规的 IEEE-754 算术中。但是,某些 C++ 实现(可能不符合 C++ 标准)使用 IEEE-754 格式,但会将次正规结果刷新为零。所以这也会产生a > b但是a-b == 0

假设一个实现支持次正规并符合 C 标准,另一个问题是该标准允许实现在浮点表达式中使用额外的精度。如果您的aandb实际上是表达式而不是单个对象,则额外的精度可能会导致a > b为真而a-b == 0为假。允许实现随意​​使用或不使用这种额外的精度,因此a > b在某些评估中可能为真,而在其他评估中可能为真,对于a-b == 0. 如果ab是单个对象,则不会发生这种情况,因为标准要求实现“丢弃”赋值和强制转换中的多余精度。