我总是假设以下测试将始终成功获得somefloat
的有限值(无INF,无NAN):
assert(somefloat*0.0==0.0);
在Multiply by 0 optimization中,有人指出double a=0.0
和double a=-0.0
严格来说并不是同一回事。
所以我想知道这是否会导致某些平台出现问题,例如:上述测试的结果可能取决于a
正面还是负面。
答案 0 :(得分:9)
如果您的实现使用IEEE 754算法(大多数情况下),那么正负零将比较相等。由于表达式的左侧只能是有限a
的正零或负零,因此断言将始终为真。
如果它使用其他类型的算法,那么只有实现者,并希望特定于实现的文档,可以告诉你。可以说(参见评论)标准的措辞可以暗示它们必须在任何情况下都是平等的,当然也没有理智的实施方式。
答案 1 :(得分:3)
-0.0 == 0.0。
对于非有限值(+ -Inf,Nan)somefloat * 0.0!= 0.0。
答案 2 :(得分:1)
只要assert
没有,somefloat
就永远不会失败
无穷大或NaN。在不支持无限或系统的系统上
NaN,编译器可以简单地优化它。