NaN
、PositiveInfinity
またはおよびNegativeInfinity
の利点は何ですか? いつそれらを使用または回避する必要がありますか?float
double
float.Parse("a")
これらのような定数がある場合、が返すのではなくエラーをスローするのはなぜfloat.NaN
ですか?
とはどのようにNaN
違うのですnull
か? division by zero
浮動型でも可能なのはなぜですか?
無限大が使用されるのは、浮動小数点がサポートする算術システムの一部であるためです。ゼロ除算など、さまざまな演算があり、無限大は有用な結果であり、数学的に理にかなっています。明らかに、直接的な物理量が無限になることはありません (たとえば、無限に多くのグラムを持つことはできません) が、無限は、物理プロセスの数学的モデルの一部の側面や、人間がコンピューターでモデル化するその他のものにとって有用な値になる場合があります。
算術システムが不完全であるため、NaN が使用されます。つまり、適切な数学的結果を浮動小数点内で表現できない入力値を使用する演算があります。たとえば、sqrt(-1) は正当な数学演算ですが、結果の虚数iは浮動小数点で表現できません。そのため、値が浮動小数点数の外に出たことを示すプレースホルダーとして NaN が使用されます。NaN は、他の方法では初期化されないデータをマークしてデバッグに役立てるなど、他の目的にも使用できます。
float.Parse("a")
これは正当な操作ではないため、NaN を返すのではなくエラーをスローします。この式は、表現可能な数値以外の適切な結果をもたらす数学演算を実行しません。これは実際のエラーであるため、エラーがスローされます。
これらは、知っておく必要があるものであるため、使用するものではありません。
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
ます。これは、より正確だと思います。
これらのような定数がある場合、なぜ
float.Parse("a")
返すのではなくエラーをスローするのfloat.NaN
ですか?
リストした代替手段はどちらもここでは適用できないためです。
PositiveInfinity
とNegativeInfinity
はまさにそれです。つまり、1/0
orなどの式の結果です-1/0
。
NaN
の結果です0/0
– つまり、結果が (通常) 明確に定義されておらず、結果が数値にならない式です。
float.Parse("a")
そのようなものではありません。確かに、これは で表される可能性がありますが、ユーザーが入力した無効な値 ( ) と有効な値 ( ) をNaN
区別できませんでした。ただし、これはあまり強力な議論ではありません。無効な数値の明示的なプレースホルダーであるため、無効なユーザー入力を表すために使用される可能性があります。float
a
float
NaN
NaN
一方、Parse
メソッドを持ち、NaN
値が存在しない他の型があります ( などint
)。したがって、これらの型の場合、エラーを通知するParse
必要があります。Parse
異なるタイプのメソッドの動作を異なるものにすることは、一貫性がありません (したがって、API 設計が不適切です) 。
算術の結果とは別に、無限値を使用してコンテキストの制限を定義できません。
例: 親 WPF コントロールは、サイズ制限がないというコンテキストの下で、その子の 1 つにそれ自体を測定するように要求します。つまり、 availableSize は PositiveInfinity です
参照: MeasureOverride
NAN と無限大を解決するには、次を使用します。
if (Double.IsNaN(YourValue) || Double.IsInfinity(YourValue))
{
YourValue = 0;
}