-1

このプログラムの理由を説明できる人はいますか?

for(float i = -1; i < 1; i += .1F)
    Console.WriteLine(i);

これを出力します:

-1

-0.9

-0.8

-0.6999999

-0.5999999

-0.4999999

-0.3999999

-0.2999999

-0.1999999

-0.99999993

7.450581E-08

0.1000001

0.2000001

0.3000001

0.4000001

0.5000001

0.6000001

0.7000001

0.8000001

0.9000002

丸め誤差はどこから来ていますか??

4

7 に答える 7

3

浮動小数点数は正しくありません。四捨五入する必要があるため、常に概算になります!!
それらはバイナリ表現で正確です。
すべての CPU または PC は、異なる結果につながる可能性があります。ウィキペディアのページ
を見てみましょう

于 2012-07-06T15:17:57.883 に答える
3

この質問は以前に何らかの形で尋ねられたに違いないと確信していますが、どこにもすぐには見つかりません。:)

答えは、浮動小数点数の表現方法に帰着します。ウィキペディアを介して技術的な詳細に入ることができますが、10 進数が必ずしも正確な浮動小数点表現を持っているとは限らないということです...

浮動小数点数 (倍精度浮動小数点数や浮動小数点数のように基数 2 の浮動小数点数) が機能する方法 [0] は、1/2 のべき乗を加算して目的の値を取得することです。したがって、0.5 はちょうど 1/2 です。0.75 は 1/2+1/4 などです。

問題は、この 2 進法で 0.1 を表現するには、ますます小さくなる 2 の累乗の無限の流れがなければ決して表現できないため、コンピューターができる最善の方法は、0.1 に非常に近いが完全ではない数値を格納することです。

通常、これらの違いに気付かないかもしれませんが、違いは存在し、時にはそれらを明らかにすることができます。これらの問題に対処するには多くの方法があり、どの方法を使用するかは、実際に何をしているかに大きく依存します。

[0] ほんのり手を振って

于 2012-07-06T15:24:47.997 に答える
2

大きな問題は、10進数0.1と同じように、1 / 3または10進数で表現できないのと同じように、2進1 / 7数で表現できないことです。したがって、コンピュータはある時点で切断する必要があるため、丸め誤差が累積されます。

ほぼすべてのプログラミング言語で実行してみてください0.1 + 0.7 == 0.8。結果としてfalseになります。

これを回避するためのC#では、decimal型を使用して精度を高めます。

于 2012-07-06T15:20:14.937 に答える
2

これは、浮動小数点に関するすべてを説明します: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

于 2012-07-06T15:28:54.880 に答える
1

丸め誤差は、Float が (10 進数に変換された場合) 正確なデータ型ではないという事実から発生します。これは近似値です

于 2012-07-06T15:19:17.083 に答える
1

これは、任意の浮動小数点変数の基本です。理由は複雑ですが、ググればたくさんの情報があります。

代わりに Decimal を使用してみてください。

于 2012-07-06T15:19:29.297 に答える
1

他の投稿者がほのめかしたように、問題は浮動小数点数が正確な 10 進数表現であるという仮定に起因します。それらはそうではありません-それらは数値の正確なバイナリ(ベース2)表現です。あなたが経験している問題は、正確な 2 進数を 10 進形式で常に表現できるとは限らないということです。ちょうど 1/3 を 10 進数形式 (.33333333...) で表現できないのと同じです。ある時点で、丸めが発生する必要があります。

あなたの例では、.1F を表すときに丸めが発生しています (これは、基数 2 で正確に表現できる値ではないためです)。

于 2012-07-06T15:22:54.413 に答える