对于浮点值a:a*0.0 == 0.0对于a的有限值是否始终求值为true?

Mar*_*tin 10 c c++ floating-point ieee-754

我总是假设以下测试将始终成功获得有限值(无INF,无NAN)somefloat:

assert(somefloat*0.0==0.0);
Run Code Online (Sandbox Code Playgroud)

Multiply by 0优化中,它表明double a=0.0并且double a=-0.0严格来说并不是相同的事情.

所以我想知道这是否会导致某些平台出现问题,例如上述测试的结果是否取决于a正面还是负面.

Mik*_*our 9

如果您的实现使用IEEE 754算法(大多数情况下),那么正负零将比较相等.由于表达式的左侧只能是有限的正零或负零a,因此断言将始终为真.

如果它使用其他类型的算法,那么只有实现者,并希望特定于实现的文档,可以告诉你.可以说(参见评论)标准的措辞可以暗示它们必须在任何情况下都是平等的,当然也没有理智的实施.

  • @MikeSeymour它在运算符的基本定义中:"如果指定的关系为真,则每个运算符应该产生'true`,如果它是假的,则每个运算符应该产生'false`." 除非你使用一个非常特殊的数学,`-0.0`等于'0.0`,所以`-0.0 == 0.0`必须返回'true`.也可以从C标准中的§5.2.4.2.2/ 1推导出它.但我同意它可以更清楚. (2认同)