10

私は常に、次のテストが次の有限値(INFなし、NANなし)で常に成功すると想定していましたsomefloat

assert(somefloat*0.0==0.0);

Multiply by 0最適化では、厳密に同じことを言っているわけではないdouble a=0.0と述べられています。double a=-0.0

したがって、これが一部のプラットフォームで問題を引き起こす可能性があるかどうか疑問に思いました。たとえば、上記のテストの結果は、aビーイングがポジティブかネガティブかによって異なります。

4

3 に答える 3

9

実装でIEEE754演算を使用している場合(ほとんどの場合)、正と負のゼロは等しく比較されます。式の左辺は、有限の場合は正または負のゼロにしかできないため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

無限大またはNaNでないassert限り、失敗することはありません。somefloat無限大またはNaNをサポートしないシステムでは、コンパイラーはそれを単純に最適化できます。

于 2012-12-20T12:37:03.150 に答える