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

时间:2012-12-20 12:31:23

标签: c++ c floating-point ieee-754

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

assert(somefloat*0.0==0.0);

Multiply by 0 optimization中,有人指出double a=0.0double a=-0.0严格来说并不是同一回事。

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

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:3)

根据双重比较规则,

-0.0 == 0.0。

对于非有限值(+ -Inf,Nan)somefloat * 0.0!= 0.0。

答案 2 :(得分:1)

只要assert没有,somefloat就永远不会失败 无穷大或NaN。在不支持无限或系统的系统上 NaN,编译器可以简单地优化它。