【发布时间】:2011-12-28 02:11:46
【问题描述】:
NaN 和 Infinity 有什么区别? NaN 什么时候出现?这是什么?
【问题讨论】:
-
仅供参考,标题排序暗示您认为浮点数和双精度数的 NaN 处理之间存在差异。 (至少我是这么认为的)如果你观察到差异会很有趣,但你只是在问一般的 NaN/Inf,这是一种非常基本的东西。
标签: c# floating-point nan
NaN 和 Infinity 有什么区别? NaN 什么时候出现?这是什么?
【问题讨论】:
标签: c# floating-point nan
来自Wikipedia:
在计算中,NaN(非数字)是数字数据类型的值,表示未定义或无法表示的值,尤其是在浮点计算中。 1985 年,IEEE 754 浮点标准引入了 NaN 的系统使用,以及其他非有限量(如无穷大)的表示。
来自MSDN:
表示非数字 (NaN) 的值。该字段是常量。
这个常数的值是零除以零的结果。
当运算结果未定义时,返回此常量。
使用 IsNaN 来确定一个值是否不是数字。无法通过将一个值与另一个等于 NaN 的值进行比较来确定一个值是否不是数字。
其中Infinity(positive infinity 和negative infinity)是导致溢出的浮点运算的结果(例如3.0 / 0)。
【讨论】:
Double.IsInfinity(3.0 / 0); 评估为真。你能指出我到底是怎么错的吗?我想知道更多:)
Infinity 是一个数学结构:
例如,在欧几里得空间中,通过零元素(在这种情况下为零)的除法应该产生无穷大:
1 / 0 = Infinity
Not a Number 或NaN 是一种计算结构,伴随着解析器和编程限制,它的输出可以根据所讨论的函数 赋予不同的含义。
例如,结果可能只能使用不同的数字系统在数学上易于处理,这对数学家来说很容易做到,但在您的函数中,您可能是唯一的实用选项返回NaN。考虑一下,-1 的平方根:
sqrt(-1) = NaN
...在complex 和phase space 中易于处理的操作。
实验:
在浏览器中打开 JavaScript.Console (CTRL+SHIFT+J),然后输入
>>> Math.sqrt(-1)
NaN
>>> 1/0
Infinity
>>> Number.MAX_VALUE
1.7976931348623157e+308
>>> Number.MAX_VALUE *2
Infinity
>>> parseFloat("I am not a Number")
NaN
在 C# 中,典型的“NaN 情况”主要通过异常处理:
csharp> Int64.MaxValue;
9223372036854775807
csharp> Int64 i_64 = Int64.MaxValue;
//the number will overflow into the sign-bit
csharp> i_64 +=1;
//...or similarly with Doubles...
csharp> Double.MaxValue;
1.79769313486232E+308
//following, an exception is thrown before overflowing
csharp> Int64 i_64 = Int64.MaxValue+1;
{interactive}(1,29): error CS0220: The operation overflows at compile time in ch
ecked mode
动态类型语言:
总的来说,NaN 的用法在不同的编程语言中有些灵活分配。在丢失一些“上下文信息”的情况下使用NaN,在动态类型的脚本语言中很方便,程序员通常不想为复杂的异常类型及其处理而烦恼。
【讨论】:
通常在 0 除以 0 时发生。在此处阅读更多信息:http://msdn.microsoft.com/en-us/library/system.double.nan.aspx
【讨论】:
NaN 代表“非数字值”。为避免异常,您可以使用 IsNaN 来确定值是否不是数字。
【讨论】:
NaN 的意思是“不是数字”,它告诉你这个 double 类型的变量没有任何值。
【讨论】:
检查double是否有值,如果没有则返回0
if (double.Equals(double.NaN, myValue))
myValue= 0;
【讨论】: