0.1 + 0.2のような浮動小数点演算は、内部で使用されている2進浮動小数点のため、丸め誤差0.30000000000000004が発生する可能性があると聞きました。C++で浮動小数点型/ダブル型に0を追加する
しかし、C++で任意の浮動小数点数に0を追加すると、丸め誤差なしで同じ値が生成されますか?浮動小数点演算がどのように機能するのか、丸め誤差が現れるか分かりません。
0.1 + 0.2のような浮動小数点演算は、内部で使用されている2進浮動小数点のため、丸め誤差0.30000000000000004が発生する可能性があると聞きました。C++で浮動小数点型/ダブル型に0を追加する
しかし、C++で任意の浮動小数点数に0を追加すると、丸め誤差なしで同じ値が生成されますか?浮動小数点演算がどのように機能するのか、丸め誤差が現れるか分かりません。
の場合、C++の実装ではIEEE754の計算がサポートされています。 IEEE754標準には数学演算の正確な定義があるため、C++では独自のルールを定義していません。しかし、IEEE754のサポートは必須ではありません。
x + 0.0 == x
は、加算、減算、乗算および除算が最後のビットに対して正確であることをIEEE754が保証するため、任意の数(*)に該当します。
(*)xが数値でない場合(NaN)、x+0.0
もNaNですが、IEEE754ではNaN != NaN
です。
ゼロ以外の値(正または負)は、NaN以外の値が保持されるため(丸めの問題なし)、浮動小数点のほとんどの実装で問題になるはずがありません。 2のべき乗も正確に表現されています。 –
0.1と0.2は、2の累乗またはそれらの有限の合計ではないため正確に表現することはできません(2のべき乗の和は、通常の32ビット浮動小数点形式では最大22 –
[任意の有限浮動小数点値に対して、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 –