9

NaN, PositiveInfinityor NegativeInfinityfor floatand有什么好处double?我们什么时候应该使用或避免使用它们?

如果有这样的常量,为什么会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您收到的是垃圾数据的结果(在字符串的情况下)还是不确定数字的实际定义,例如零除以零。所以,为了区分这两种情况,double.Parse("a")抛出一个Exception我觉得更准确的方法。

于 2013-02-27T16:46:11.563 回答
6

如果有这样的常量,为什么要float.Parse("a")抛出错误而不是返回float.NaN

因为您列出的替代方案均不适用于此处:

PositiveInfinity就是这样NegativeInfinity- 即它们是诸如1/0or之类的表达式的结果-1/0

NaN0/0- 即结果不是(通常)明确定义且不产生数字的表达式的结果。

float.Parse("a")不是那样的。诚然,它可能表示为,NaN但您无法区分用户输入的无效float值 ( a) 和有效值float( NaN)。然而,这不是一个非常有力的论点:NaN明确地是无效数字的占位符,因此可以想象它可以用来表示无效的用户输入。

另一方面,还有其他类型具有Parse方法但不NaN存在值(例如int)。因此,对于这些类型,Parse 必须发出错误信号。使不同类型的Parse方法表现不同是不一致的(因此是糟糕的 API 设计)。

于 2013-02-27T16:47:05.797 回答
1

除了算术的结果之外,无穷大值可用于定义上下文的无限制。

例如:在没有大小限制的情况下,父 WPF 控件要求其子项测量自身;即 availableSize 是 PositiveInfinity

参考:MeasureOverride

于 2013-02-27T16:51:11.670 回答
-1

To resolve NAN and infinity, use this:

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