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

NaNInfinity 有什么区别? NaN 什么时候出现?这是什么?

【问题讨论】:

  • 仅供参考,标题排序暗示您认为浮点数和双精度数的 NaN 处理之间存在差异。 (至少我是这么认为的)如果你观察到差异会很有趣,但你只是在问一般的 NaN/Inf,这是一种非常基本的东西。

标签: c# floating-point nan


【解决方案1】:

来自Wikipedia

在计算中,NaN(非数字)是数字数据类型的值,表示未定义或无法表示的值,尤其是在浮点计算中。 1985 年,IEEE 754 浮点标准引入了 NaN 的系统使用,以及其他非有限量(如无穷大)的表示。

来自MSDN

  • 表示非数字 (NaN) 的值。该字段是常量。

  • 这个常数的值是零除以零的结果。

  • 当运算结果未定义时,返回此常量。

  • 使用 IsNaN 来确定一个值是否不是数字。无法通过将一个值与另一个等于 NaN 的值进行比较来确定一个值是否不是数字。

其中Infinitypositive infinitynegative 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;
          

          【讨论】:

          • 这不是问题的答案吗?
          猜你喜欢
          • 1970-01-01
          • 2020-10-12
          • 2011-06-11
          • 2010-10-02
          • 2013-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多