2016-07-18 1 views
1

0.1 + 0.2のような浮動小数点演算は、内部で使用されている2進浮動小数点のため、丸め誤差0.30000000000000004が発生する可能性があると聞きました。C++で浮動小数点型/ダブル型に0を追加する

しかし、C++で任意の浮動小数点数に0を追加すると、丸め誤差なしで同じ値が生成されますか?浮動小数点演算がどのように機能するのか、丸め誤差が現れるか分かりません。

+0

ゼロ以外の値(正または負)は、NaN以外の値が保持されるため(丸めの問題なし)、浮動小数点のほとんどの実装で問題になるはずがありません。 2のべき乗も正確に表現されています。 –

+0

0.1と0.2は、2の累乗またはそれらの有限の合計ではないため正確に表現することはできません(2のべき乗の和は、通常の32ビット浮動小数点形式では最大22 –

+0

[任意の有限浮動小数点値に対して、x-x == 0?](http://stackoverflow.com/q/3599579/995714)、https://randomascii.wordpress.com/2013/07/16/floating-point-determinism /、http://stackoverflow.com/q/10791894/995714 –

答えて

1

の場合、C++の実装ではIEEE754の計算がサポートされています。 IEEE754標準には数学演算の正確な定義があるため、C++では独自のルールを定義していません。しかし、IEEE754のサポートは必須ではありません。

x + 0.0 == xは、加算、減算、乗算および除算が最後のビットに対して正確であることをIEEE754が保証するため、任意の数(*)に該当します。

(*)xが数値でない場合(NaN)、x+0.0もNaNですが、IEEE754ではNaN != NaNです。

+0

IEEE754以外の実装はありますか?プロセッサ(数値演算コプロセッサ)のみで実際には決定されますか? – JavaMan

+0

@JavaMan:IEEE754に違反する "安全でない"最適化はかなりの数のコンパイラが行うことができます。古典的な例 '(a * a * a * a * a)'は '(a * a * a)*(a * a * a) 'それではプロセッサーだけではありません。 – MSalters

関連する問題