1

少し軽く読んだ後、次の記事に興味をそそられました。

MSDN のステートメントを考えると、はい、2 つのステートメントは同等であると考えていました。

ゼロより大きい最小の正の Double 値を表します。このフィールドは定数です。

人々がどう思うか興味津々。

編集:VSがオンになっているコンピューターを見つけて、このテストを実行しました。はい、予想通り、それらは同等であることがわかりました。

    [Test]
    public void EpsilonTest()
    {
        Compare(0d);
        Compare(double.Epsilon);
        Compare(double.Epsilon * 0.5);
        Compare(double.NaN);
        Compare(double.PositiveInfinity);
        Compare(double.NegativeInfinity);
        Compare(double.MaxValue);
        Compare(double.MinValue);
    }

    public void Compare(double x)
    {
        Assert.AreEqual(Math.Abs(x) == 0d, Math.Abs(x) < double.Epsilon);
    }
4

4 に答える 4

1

ここでの「同等」とはかなり曖昧な用語であるため、何を意味するのかわかりません。

つまり、 .NET は より小さい値double.Epsilonを に等しいと 0d見なしますか? リンク先の記事が明確に示しているように、そうです。これは非常に簡単に表示できます。

var d1 = 0d;
var d2 = double.Epsilon * 0.5;
Console.WriteLine("{0:r} = {1:r}: {2}", d1, d2, d1.Equals(d2));
// Prints: 0 = 0: True

その意味で、何らかの方法で の値xが より小さい場合double.Epislon、それは既にメモリ内にゼロ値として格納されているため、どちらが であるかは にAbs(x)なります。Abs(0)== 0d

しかし、これは、浮動小数点数を保持するために .NET で使用されるバイナリ表現の制限です。ゼロ以外の数値を表すことができないdouble.Epsilonため、丸められます。

これは、2 つのステートメントが「同等」であることを意味するものではありません。これは完全にコンテキストに依存するためです。明らかに、4.94065645841247E-324 * 0.5はゼロではなく、 です2.470328229206235e-324。そのレベルの精度を必要とする計算を行っている場合、それらは同等ではありません。また、C# でそれらを実行しようとしても不運です。

ほとんどの場合、 の値double.Epsilonはまったく小さすぎて、値を取得できません。つまり、よりもはるかに大きな値の場合はそうAbs(x)すべきですが、C# ではそれを理解する必要があります。要求があれば、喜んでその精度まで計算を行います。== 0ddouble.Epison

于 2013-11-26T16:55:53.010 に答える
1

はい、私が知る限り、それらは同等である必要があります。これは、イプシロンよりも小さい大きさでゼロ以外の差がないためです。

私の唯一の考えは、double.NaN などの値に関するものでした。それと PositiveInfinity などをテストしましたが、結果は同じでした。ちなみに、double.NaN を数値と比較すると false が返されます。

于 2013-11-26T16:52:11.783 に答える