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

对于floatdoubleNaNPositiveInfinityNegativeInfinity有什么好处? 我们何时应该使用或避免它们?

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

NaNnull什么不同? 为什么浮动类型甚至可以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 – 而单词“not a number”意味着像double.Parse("a")类的东西也应该返回double.NaN ,it才不是。 为什么?

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

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

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

PositiveInfinityNegativeInfinity只是 – 即它们是1/0-1/0等表达式的结果。

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

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

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

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

例如:在没有大小限制的情况下,父WPF控件要求其子级之一进行自我测量; 即availableSize是PositiveInfinity

参考: MeasureOverride

要解决NAN和无穷大,请使用以下命令:

 if (Double.IsNaN(YourValue) || Double.IsInfinity(YourValue)) { YourValue = 0; }