NaN 对双打意味着啥?
Posted
技术标签:
【中文标题】NaN 对双打意味着啥?【英文标题】:what does NaN mean for doubles?NaN 对双打意味着什么? 【发布时间】:2011-12-28 02:11:46 【问题描述】:NaN
和 Infinity
有什么区别? NaN
什么时候出现?这是什么?
【问题讨论】:
仅供参考,标题排序暗示您认为浮点数和双精度数的 NaN 处理之间存在差异。 (至少我是这么认为的)如果你观察到差异会很有趣,但你只是在问一般的 NaN/Inf,这是一种非常基本的东西。 In Java, what does NaN mean?的可能重复 【参考方案1】:来自Wikipedia:
在计算中,NaN(非数字)是数字数据类型的值,表示未定义或无法表示的值,尤其是在浮点计算中。 1985 年,IEEE 754 浮点标准引入了 NaN 的系统使用,以及其他非有限量(如无穷大)的表示。
来自MSDN:
表示非数字 (NaN) 的值。该字段是常量。
这个常数的值是零除以零的结果。
当运算结果未定义时,返回此常量。
使用 IsNaN 来确定一个值是否不是数字。无法通过将一个值与另一个等于 NaN 的值进行比较来确定一个值是否不是数字。
其中Infinity
(positive infinity 和negative infinity)是导致溢出的浮点运算的结果(例如3.0 / 0
)。
【讨论】:
无穷大不是被零除的结果。它在数学上是不正确的(我希望处理器也不会给出那个结果)。如果 C# 这样做了,那就嘘他们。 @MerlynMorgan-Graham 我不会就“数学”部分与您争论,但在计算上我是正确的,因为检查Double.IsInfinity(3.0 / 0);
评估为真。你能指出我到底是怎么错的吗?我想知道更多:)
如果你检查过,我相信你。所以看看我的最后一句话,向 MS 嘘 :)
不只是 MS,codepad.org/jFlQi5pQ 用于 C++,在 javascript 中也是如此。我认为它是浮点标准的一部分?
@m93a 已更正。我仍然认为更频繁的用例应该是 NaN(尽管如果 Infinity 在不太常见的用例中丢失的信息更少,并且仍然支持典型的错误处理情况,也许这是一个合理的决定)。我最初的评论是试图简洁地展示 OP 的不同之处,不幸的是没有现实支持它:)【参考方案2】:
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
,在动态类型的脚本语言中很方便,程序员通常不想为复杂的异常类型及其处理而烦恼。
【讨论】:
【参考方案3】:通常在 0 除以 0 时发生。在此处阅读更多信息:http://msdn.microsoft.com/en-us/library/system.double.nan.aspx
【讨论】:
【参考方案4】:NaN 代表“非数字值”。为避免异常,您可以使用 IsNaN 来确定值是否不是数字。
【讨论】:
【参考方案5】:NaN 的意思是“不是数字”,它告诉你这个 double 类型的变量没有任何值。
【讨论】:
【参考方案6】:检查double是否有值,如果没有则返回0
if (double.Equals(double.NaN, myValue))
myValue= 0;
【讨论】:
这不是问题的答案吗?以上是关于NaN 对双打意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章