NaN 对双打意味着啥?

Posted

技术标签:

【中文标题】NaN 对双打意味着啥?【英文标题】:what does NaN mean for doubles?NaN 对双打意味着什么? 【发布时间】:2011-12-28 02:11:46 【问题描述】:

NaNInfinity 有什么区别? 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 NumberNaN 是一种计算结构,伴随着解析器和编程限制,它的输出可以根据所讨论的函数 赋予不同的含义。

例如,结果可能只能使用不同的数字系统在数学上易于处理,这对数学家来说很容易做到,但在您的函数中,您可能是唯一的实用选项返回NaN。考虑一下,-1 的平方根:

sqrt(-1) = NaN

...在complexphase 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 对双打意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章

HSQLDB 语句和 Java NaN 双打

C语言中INF和NAN是啥意思

(NaN != NaN) 和 (NaN !== NaN) 有啥区别?

nan是啥意思

nan是啥意思

NaN啥意思?