何时使用NaN或+/-无限?

时间:2013-02-27 16:43:42

标签: c# nan infinity

NaNPositiveInfinityNegativeInfinityfloatdouble有什么好处?我们什么时候应该使用或避免使用它们?

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

NaNnull有何不同?为什么division by zero甚至可以用于浮动类型?

5 个答案:

答案 0 :(得分:9)

使用无穷大是因为它们是浮点支持的算术系统的一部分。存在各种操作,例如除以零,其中无穷大是有用的结果并且在数学上是合理的。显然,没有直接的物理量可以是无限的(例如,你不能有无限多的克),但无穷大可能是物理过程的数学模型或人类用计算机建模的其他事物的某些方面的有用价值。

使用NaNs是因为算术系统不完整。也就是说,存在具有输入值的操作,其中适当的数学结果在浮点内不可表示。例如,sqrt(-1)是一个合法的数学运算,但结果,虚数 i ,在浮点数中无法表示。因此,NaN用作占位符以指示值已超出浮点数。 NaN还可以用于其他目的,例如标记未以其他方式初始化的数据,以帮助调试。

float.Parse("a")抛出错误而不是返回NaN,因为它不是合法的操作。此表达式不执行在可表示数字之外具有适当结果的数学运算。这是一个实际错误,因此会抛出错误。

答案 1 :(得分:7)

它们不是你使用的东西,因为它们是你需要注意的东西:

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")的内容也应该返回{ {1}},但事实并非如此。为什么呢?

我的预感是因为无法确定您收到的double.NaN是垃圾数据(在字符串的情况下)还是实际定义的不确定结果数字,如零除以零。因此,为了区分这两种情况,double.NaN抛出一个double.Parse("a"),我认为这更准确。

答案 2 :(得分:6)

  

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

因为您列出的替代品都不适用于此处:

PositiveInfinityNegativeInfinity就是这样 - 即它们是1/0-1/0等表达式的结果。

NaN0/0的结果 - 也就是说,结果不是(通常)定义良好且不会产生数字的表达式。

float.Parse("a")就是这样。不可否认,它可能由NaN表示,但您无法区分用户输入无效float值(a)和有效float值({ {1}})。但这不是一个非常强大的论据:NaN 显式是一个无效数字的占位符,因此可以想象它可以用来表示无效的用户输入。

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

答案 3 :(得分:1)

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

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

参考:MeasureOverride

答案 4 :(得分:-1)

要解析NAN和无穷大,请使用:

if (Double.IsNaN(YourValue) || Double.IsInfinity(YourValue))
{
   YourValue = 0;
}
相关问题