【问题标题】:What do these three special floating-point values mean: positive infinity, negative infinity, NaN?这三个特殊的浮点值是什么意思:正无穷大、负无穷大、NaN?
【发布时间】:2010-11-03 16:51:36
【问题描述】:

我们如何在代码中使用它们,什么会导致 NaN(不是数字)?

【问题讨论】:

    标签: java floating-point nan infinity


    【解决方案1】:
    • 正无穷是指在正方向上趋于无穷 - 进入正方向上幅度越来越大的值。
    • 负无穷是指在负方向上趋于无穷——在负方向上的值越来越大。
    • Not-a-number (NaN) 是未定义的东西,例如 0/0 的结果。

    还有来自Float 类规范的常量:

    更多信息可以在IEEE-754 page in Wikipedia找到。

    这里有一个小程序来说明这三个常量:

    System.out.println(0f / 0f);
    System.out.println(1f / 0f);
    System.out.println(-1f / 0f);
    

    输出:

    NaN
    Infinity
    -Infinity
    

    【讨论】:

    • 但我认为 1/0 会导致正无穷大:-?
    • 是的,你是对的——那是我的错误,并且已经修复。
    【解决方案2】:
    • 1/0 将导致正无穷大。
    • 0/0 将导致 Nan。您可以将 NaN 用作任何其他数字,例如:NaN+NaN=NaN, NaN+2.0=NaN
    • -1/0 将导致负无穷大。

    无穷大(在java中)意味着一个运算的结果将是一个非常大的正数或负数,以至于无法正常表示。

    【讨论】:

      【解决方案3】:

      如果您想了解更多关于 Java 中浮点数的信息,This 可能是一个很好的参考。

      正无穷大是一个大到无法正常表示的正数。负无穷大是一个大到无法正常表示的负数。 NaN 的意思是“不是数字”,它是由不会产生数字的数学运算产生的——比如将 0 除以 0。

      在 Java 中,Double 和 Float 类都有代表所有三种情况的常量。它们是 POSITIVE_INFINITY、NEGATIVE_INFINITY 和 NaN。

      另外考虑一下:

      double a = Math.pow(10, 600) - Math.pow(10, 600); //==NaN
      

      在数学上,每个人都可以看到它是0。但是对于机器来说,它是一个“Infinity” - “Infinity”(同秩),它确实是NaN。

      【讨论】:

      • 我试图修复损坏的链接,但被拒绝了。 Here 是一个非常好的资源,其中还包括一个 QA 部分,其中包含进一步探索的链接。
      • 我不同意(这里和其他地方)正无穷大是“一个大到无法正常表示的数字”的描述。它可以是一个大到无法表示为普通浮点数的数字,但实际上它通常源自 5f/0f 之类的东西,这不是一个大(实数)数;它是无限的幼稚版本。 (从技术上讲,+inf、-inf 和 NaN 是实数的扩展,它们提供了对任何算术运算的闭包,但代价是违反了基本的场公理。这对计算机科学家来说无关紧要,对数学家来说却很重要)。跨度>
      • @PeterWebb:不幸的是,NaN 不仅被定义为未排序,而且还被定义为不等于自身,这意味着 floatdouble 不仅违反了场公理——它们没有甚至等价类。不仅仅是数学家,更多的人对此感兴趣,因为它迫使使用丑陋的组合来使集合起作用。
      • @PeterWebb 实际上,即使没有 ±inf/NaN floatdouble 等,也会违反场公理,即关联性。在任何情况下,它们都不应该成为想要处理真实实数的数学家的基本构建块——因为那些有可以处理精确数字的计算机代数系统。
      【解决方案4】:

      这个想法是表示可以从对“正常”数字的操作中自然产生的特殊数字。您可以将无穷大(正数和负数)视为浮点表示的“溢出”,其想法是至少在某些情况下,函数返回这样的值仍然会产生有意义的结果。例如,它们仍然具有一些排序属性(例如,它们不会进行排序操作)。

      Nan 非常特别:如果 x 是 Nan,则 x == x 为假(这实际上是测试 nan 的一种方法,至少在 C 中如此)。如果您不习惯浮点特性,这可能会非常令人困惑。除非您进行科学计算,否则我会说通过操作返回 Nan 是一个错误,至少在大多数情况下是这样。 Nan可以进行各种操作:0/0、inf - inf、inf/inf、0*inf。 Nan 也没有任何排序属性。

      【讨论】:

        【解决方案5】:

        您可以将它们用作任何其他数字:

        例如:

        float min = Float.NEGATIVE_INFINITY;
        float max = Float.POSITIVE_INFINITY;
        float nan = Float.NaN;
        

        【讨论】:

          【解决方案6】:

          正无穷大是一个很大的正数,它不可能是 正常表示。负无穷大是一个很大的负数 不能正常表示。 NaN 表示“不是数字”,并且 不产生数字的数学运算的结果- 就像 0 除以 0。

          这不是一个完整的答案(或不够清楚) - 考虑一下:

          double a = Math.pow(10,600) - Math.pow(10,600); //==NaN
          

          在数学上每个人都可以看到它是 0。但是对于机器来说它是一个“无穷大”——“无穷大”(同阶)女巫确实是 NaN...

          【讨论】:

          • 如果引用答案,通常最好留下评论或建议编辑。答案应该能够独立存在。
          • 好吧,我不知道我可以编辑其他帖子...它就像一个 git :)
          猜你喜欢
          • 2023-03-20
          • 2016-10-16
          • 2012-02-09
          • 2013-11-29
          • 2017-08-19
          • 2015-03-22
          • 1970-01-01
          • 2022-08-12
          相关资源
          最近更新 更多