我一直认为以下测试在somefloat
是有限值(没有INF,没有NAN)时总是会成功的:
assert(somefloat*0.0==0.0);
在“乘以0的优化”中指出,double a=0.0
和double a=-0.0
严格来说并不是一回事。
因此我想知道这是否会在某些平台上引起问题,例如上述测试的结果是否取决于a
是正数还是负数。
我一直认为以下测试在somefloat
是有限值(没有INF,没有NAN)时总是会成功的:
assert(somefloat*0.0==0.0);
在“乘以0的优化”中指出,double a=0.0
和double a=-0.0
严格来说并不是一回事。
因此我想知道这是否会在某些平台上引起问题,例如上述测试的结果是否取决于a
是正数还是负数。
-0.0
等于 0.0
,所以 -0.0 == 0.0
必须返回 true
。也可以从 C 标准的§5.2.4.2.2/1中推断出这一点。但我同意它可能不够清晰。 - James Kanze-0.0和0.0在双精度比较规则下相等。
对于非有限值(+-Inf,Nan),某些浮点数*0.0!=0.0。
NaN
作为有限值有点奇怪。OP 询问有限值。 - nhahtdhsomefloat*0. != 0.
的结果为true
。” - Eric Postpischil只要somefloat
不是无穷大或NaN,您的assert
就永远不会失败。在不支持无穷大或NaN的系统上,编译器可以简单地将其优化掉。
+0.0
和-0.0
具有相同的行为。您引用的线程中提出的另一种观点是错误的,至少对于C和C++而言。 - James Kanzeatan2
函数是否允许(但不需要)返回一个关于atan2(ZERO,ZERO)
和atan2(NEGATIVE_ZERO,NEGATIVE_ZERO)
值不同的结果?因此,另一个问题中这种优化的有效性并不只是两个可能结果是否相等的问题。但我认为你所写的是正确的,因为据我所知,在C和C++中,表达式-0.0
不会评估为负零。 - Steve Jessopatan2
中使用它。当然,这个问题中的断言是另一回事。 - Steve Jessop