9

NaNPositiveInfinityまたはおよびNegativeInfinityの利点は何ですか? いつそれらを使用または回避する必要がありますか?floatdouble

float.Parse("a")これらのような定数がある場合、が返すのではなくエラーをスローするのはなぜfloat.NaNですか?

とはどのようにNaN違うのですnullか? division by zero浮動型でも可能なのはなぜですか?

4

5 に答える 5

11

無限大が使用されるのは、浮動小数点がサポートする算術システムの一部であるためです。ゼロ除算など、さまざまな演算があり、無限大は有用な結果であり、数学的に理にかなっています。明らかに、直接的な物理量が無限になることはありません (たとえば、無限に多くのグラムを持つことはできません) が、無限は、物理プロセスの数学的モデルの一部の側面や、人間がコンピューターでモデル化するその他のものにとって有用な値になる場合があります。

算術システムが不完全であるため、NaN が使用されます。つまり、適切な数学的結果を浮動小数点内で表現できない入力値を使用する演算があります。たとえば、sqrt(-1) は正当な数学演算ですが、結果の虚数iは浮動小数点で表現できません。そのため、値が浮動小数点数の外に出たことを示すプレースホルダーとして NaN が使用されます。NaN は、他の方法では初期化されないデータをマークしてデバッグに役立てるなど、他の目的にも使用できます。

float.Parse("a")これは正当な操作ではないため、NaN を返すのではなくエラーをスローします。この式は、表現可能な数値以外の適切な結果をもたらす数学演算を実行しません。これは実際のエラーであるため、エラーがスローされます。

于 2013-02-27T16:56:57.070 に答える
9

これらは、知っておく必要があるものであるため、使用するものではありません。

double hmm = 1.0 / 0.0;
double hmm2 = -1.0 / 0.0;
double hmm3 = 0.0 / 0.0;
Console.WriteLine("1/0 == {0}", hmm);
Console.WriteLine("-1/0 == {0}", hmm2);
Console.WriteLine("0/0 == {0}", hmm3);

出力:

1/0 == Infinity
-1/0 == -Infinity
0/0 == NaN

編集:この質問について:

これらのような定数がある場合、float.Parse("a") が float.NaN を返すのではなくエラーをスローするのはなぜですか?

double.NaNは実際にはある意味で数学的な定義です-「定義」されてい0.0/0.0ます-「数ではない」という言葉は、のようなものdouble.Parse("a")も返す必要があることを意味しますdouble.NaNが、そうではありません。なんで?

double.NaN私の推測では、受け取った がガベージ データ (文字列の場合) の結果なのか、それとも0 を 0 で割ったような不確定な数値の実際の定義なのかを判断するのは不可能だからです。したがって、これら 2 つのケースを区別するために、 は をdouble.Parse("a")スローしExceptionます。これは、より正確だと思います。

于 2013-02-27T16:46:11.563 に答える
6

これらのような定数がある場合、なぜfloat.Parse("a")返すのではなくエラーをスローするのfloat.NaNですか?

リストした代替手段はどちらもここでは適用できないためです。

PositiveInfinityNegativeInfinityはまさにそれです。つまり、1/0orなどの式の結果です-1/0

NaNの結果です0/0– つまり、結果が (通常) 明確に定義されておらず、結果が数値にならない式です。

float.Parse("a")そのようなものではありません。確かに、これは で表される可能性がありますが、ユーザーが入力した無効な値 ( ) と有効な値 ( ) をNaN区別できませんでした。ただし、これはあまり強力な議論ではありません。無効な数値の明示的なプレースホルダーであるため、無効なユーザー入力を表すために使用される可能性があります。floatafloatNaNNaN

一方、Parseメソッドを持ち、NaN値が存在しない他の型があります ( などint)。したがって、これらの型の場合、エラーを通知するParse 必要があります。Parse異なるタイプのメソッドの動作を異なるものにすることは、一貫性がありません (したがって、API 設計が不適切です) 。

于 2013-02-27T16:47:05.797 に答える
1

算術の結果とは別に、無限値を使用してコンテキストの制限を定義できません。

例: 親 WPF コントロールは、サイズ制限がないというコンテキストの下で、その子の 1 つにそれ自体を測定するように要求します。つまり、 availableSize は PositiveInfinity です

参照: MeasureOverride

于 2013-02-27T16:51:11.670 に答える
-1

NAN と無限大を解決するには、次を使用します。

if (Double.IsNaN(YourValue) || Double.IsInfinity(YourValue))
{
   YourValue = 0;
}
于 2016-10-27T11:28:25.287 に答える