10

我一直假设以下测试对于有限值(无 INF,无 NAN)总是会成功somefloat

assert(somefloat*0.0==0.0);

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

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

4

3 回答 3

9

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

如果它使用某种其他类型的算术,那么只有实现者,并希望实现特定的文档,可以告诉你。可以说(见评论)标准的措辞可以被认为暗示它们在任何情况下都必须比较相等,当然没有理智的实现会这样做。

于 2012-12-20T12:36:53.930 回答
3

-0.0 == 0.0 根据双重比较规则。

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

于 2012-12-20T12:33:37.440 回答
1

assert只要somefloat不是无穷大或 NaN ,您就永远不会失败。在不支持无穷大或 NaN 的系统上,编译器可以简单地对其进行优化。

于 2012-12-20T12:37:03.150 回答