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