1

最新のコンピューター システムで実行される浮動小数点演算は、実際の演算と常に一致するとは限らないことを理解しています。これを実証するために、小さな C# プログラムを考案しようとしています。例えば:

static void Main(string[] args)
    {
        double x = 0, y = 0;

        x += 20013.8;
        x += 20012.7;

        y += 10016.4;
        y += 30010.1;

        Console.WriteLine("Result: "+ x + " " + y + " " + (x==y));
        Console.Write("Press any key to continue . . . "); Console.ReadKey(true);
    }

ただし、この場合、xyは最終的には等しくなります。

同様の複雑さのプログラムを使用して、本当にクレイジーな数値を使用せずに、浮動小数点演算の矛盾を示すことは可能ですか? 可能であれば、小数点を数桁超える数学的に正しい値を避けたいと思います。

4

9 に答える 9

5
double x = (0.1 * 3) / 3;
Console.WriteLine("x: {0}", x); // prints "x: 0.1"
Console.WriteLine("x == 0.1: {0}", x == 0.1); // prints "x == 0.1: False"

注意: これに基づいて、.NET では浮動小数点演算が信頼できないと仮定しないでください。

于 2010-04-15T17:19:03.260 に答える
2

私のお気に入りのデモンストレーションは要約すると

double d = 0.1;
d += 0.2;
d -= 0.3;

Console.WriteLine(d);

出力はではありません 0

于 2010-04-15T17:41:42.677 に答える
2

これは、float 演算が思ったとおりに機能しないことを示す前の質問に基づく例です。

float f = (13.45f * 20);
int x = (int)f;
int y = (int)(13.45f * 20);
Console.WriteLine(x == y);

この場合、falseが画面に出力されます。なんで?数学が実行される場所と int へのキャストが行われる場所のためです。x の場合、計算は 1 つのステートメントで実行され、f に格納さ、整数にキャストされます。y の場合、キャストの前に計算の値が格納されることはありません。( x では、計算とキャストの間でいくらかの精度が失われますが、y の場合はそうではありません。 )

float 数学で具体的に何が起こっているかの背後にある説明については、この質問/回答を参照してください。括弧で区切られた場合とステートメントで区切られた場合でC#の浮動小数点精度が異なるのはなぜですか?

于 2010-04-15T17:28:39.357 に答える
1

小数が .5 にならないようにしてください。

こちらの記事をご覧ください

http://floating-point-gui.de/

于 2010-04-15T17:16:59.583 に答える
0

非常に大きな数と非常に小さな数を合計してみてください。小さなものは消費され、結果は大きな数と同じになります。

于 2010-04-15T17:18:51.290 に答える
0

無理数 (平方根など) または非常に長い繰り返し分数に対して繰り返し演算を実行してみてください。エラーが蓄積するのがすぐにわかります。たとえば、1000000*Sqrt(2) 対 Sqrt(2)+Sqrt(2)+...+Sqrt(2) を計算します。

于 2010-04-15T17:19:48.347 に答える
0

私が今考えることができる最も簡単なものはこれです:

class Test
{
    private static void Main()
    {
        double x = 0.0;

        for (int i = 0; i < 10; ++i)
            x += 0.1;

        Console.WriteLine("x = {0}, expected x = {1}, x == 1.0 is {2}", x, 1.0, x == 1.0);
        Console.WriteLine("Allowing for a small error: x == 1.0 is {0}", Math.Abs(x - 1.0) < 0.001);
    }
}
于 2010-04-15T17:24:43.567 に答える
0

本当に興味があるなら、浮動小数点数について議論している多くのページのいずれかを参照することをお勧めします。コンピューターでは、距離と精度をトレードオフする妥協点であることがすぐにわかります。それらを使用するプログラムを作成する場合は、注意を怠ると発生する可能性のある制限と問題を理解する必要があります。それはあなたの時間の価値があります。

于 2010-04-15T17:26:45.770 に答える
-1

double〜15桁まで正確です。少数の浮動小数点演算で実際に問題を解決するには、より高い精度が必要です。

于 2010-04-15T17:19:37.160 に答える