41

浮動小数点値の場合、 1a + bと同じであることが保証されていますか? b + a

これはIEEE754で保証されていると思いますが、C++標準ではIEEE754を使用する必要があるとは規定していません。関連する唯一のテキストは [expr.add]#3 からのようです:

二項 + 演算子の結果は、オペランドの合計です。

算術演算「合計」は交換可能です。ただし、数学演算「合計」も結合的ですが、浮動小数点の加算は結合的ではありません。したがって、数学における「合計」の可換性は、この引用が C++ における可換性を指定していることを意味すると結論付けることはできないように私には思えます。


脚注 1: +0 と-0を区別するため
のビットごとの同一の「同じ」 。IEEE754 はtrue として扱いますが、符号付きゼロに関する特定の規則もあります。 どちらもIEEE754で生成され、同じ大きさの反対符号の値の追加についても同じです。IEEE セマンティクスに従ったは、それが基準である場合、符号付きゼロの非可換性を隠します。memcmp==+0.0 == -0.0+0 + -0-0 + +0+0==

また、a+b == b+aいずれかの入力が NaN の場合、IEEE754 演算では false になります。 memcmpは、2 つの NaN が同じビットパターン (ペイロードを含む) を持っているかどうかを示しますが、有効な数学演算の可換性とは別に NaN の伝播規則を考慮することができます。

4

3 に答える 3

12

C++ 標準は非常に明確にIEEE 754 を保証しません。ライブラリは IEC 559 (基本的に IEEE 754 標準の IEC バージョン) をある程度サポートしているため、基本的な実装が IEEE 754/IEC 559 を使用しているかどうかを確認できます。 (もちろん、それが保証するものに依存することができます)。

ほとんどの場合、C および C++ 標準は、そのような基本的な操作が実装されることを前提としていますが、基礎となるハードウェアは機能します。IEEE 754 のような一般的なものでは、存在するかどうかを検出できますが、それでも必要ありません。

于 2014-06-27T01:57:25.703 に答える