web-dev-qa-db-ja.com

浮動小数点加算はC ++で可換ですか?

浮動小数点値の場合、a + b == b + a

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

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

数学演算「合計」は可換です。ただし、数学演算「合計」も結合法則ですが、浮動小数点の加算は間違いなくnot結合法則です。したがって、数学における「合計」の可換性は、この引用がC++における可換性を指定していることを意味すると結論付けることはできないように思われます。

36
M.M

a + b == a + bである必要はありません。部分式の1つは、他の部分式よりも正確に加算の結果を保持できます。たとえば、複数の加算を使用する場合、部分式の1つを一時的にメモリに格納する必要がある場合、他の部分式をレジスタに保持できる場合(より高い精度で)。

a + b == a + bが保証されていない場合、a + b == b + aできません保証されます。 a + bが毎回同じ値を返す必要がなく、値が異なる場合、そのうちの1つ必然的にb + aの特定の評価と等しくなりません。

15
user743382

いいえ、C++言語では通常、ハードウェアにそのような要件はありません。演算子の結合性のみが定義されています。

あらゆる種類のクレイジーなことがdo浮動小数点演算で発生します。おそらく、一部のマシンでは、非正規化数にゼロを加算するとゼロが生成されます。ゼロ値のレジスタをメモリ内の非正規化数に追加した場合、マシンがメモリの更新を回避できると考えられます。本当にばかげたコンパイラが常にLHSをメモリに入れ、RHSをレジスタに入れる可能性があります。

ただし、非可換加算を使用するマシンでは、取得する操作を制御する場合は、式を命令にマップする方法を具体的に定義する必要があることに注意してください。左側は最初のマシンオペランドまたは2番目のマシンオペランドに入りますか?

そのようなABI仕様は、同じ息で表現と指示の構築に言及しているので、非常に病的です。

19
Potatoswatter

C++標準は非常に具体的にnot IEEE754を保証します。ライブラリはIEC 559(基本的にはIEEE 754標準のIECバージョン)をある程度サポートしています) 、したがって、次のことができますチェック基礎となる実装がIEEE 754/IEC 559を使用しているかどうか(使用する場合は、もちろん、保証内容に依存できます)。

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

11
Jerry Coffin