【问题标题】:NaN Constant Magic in Java [duplicate]Java中的NaN常量魔术[重复]
【发布时间】:2012-09-19 22:47:04
【问题描述】:

可能重复:
Why does Double.NaN==Double.NaN return false?

NaN = “NaN”代表“非数字”。如果浮点运算有一些输入参数会导致运算产生一些未定义的结果,则会产生“Nan”。例如,0.0 除以 0.0 在算术上是未定义的。取负数的平方根也是未定义的。

我试图在 Java 中使用 NaN 常量

public class NaNDemo {
    public static void main(String s[]) {
        double x = Double.NaN;
        double y = Double.NaN;

        System.out.println((x == y));
        System.out.println("x=" + x);
        System.out.println("y=" + y);
    }
}

输出

false
x=NaN
y=NaN

那么为什么 x==y 是假的呢?

【问题讨论】:

标签: java


【解决方案1】:

两个NaN 值不能彼此相等。你不知道它们代表什么未定义的值。而且你也不知道它们是如何表示的。

正如JLS中所引用的-

特殊数字NaN (not-a-number) 是无序的,具有 以下字符:

  • 如果一个或两个操作数都是 NaN,则数值比较运算符 和 >= 始终返回 false。
  • 如果任一操作数为 NaN,则相等运算符 == 返回 false。
  • 如果任一操作数为 NaN,则不等式运算符 != 返回 true。

如果你这样定义它们:-

    Double a = new Double(Double.NaN);
    Double b = new Double(Double.NaN);

    if (a == b) {
        System.out.println("true");   /** You will get true **/
    }

【讨论】:

  • 这个不太对,相当于Double.longBitsToDouble(0x7ff8000000000000L)返回的值。
  • @MeNoMore.. 你说的是哪一部分.. 我猜第二行 -> 你不知道它们代表什么未定义的值.. 也许你是对的,因为我我不确定这个..
  • 我的意思也是表示部分 -> “你不知道它们是如何表示的”。你现在可能没有想到 NaN,但是 Java 声明了它们的值,你可以告诉他们你会得到 NaN,这是它们的表示。
  • 好的.. 谢谢 MeNoMore.. 从来没有遇到过NaN 面对面.. 所以,对它了解不多..
  • -1:如果您从该源获取某些内容,则应指定该源。描述取自Java SE Specification
【解决方案2】:

NaN 是一个概念,而不是一个值或一个数字。由于该概念可以表示多个非实数值(虚数、0/0 等),因此说任何特定的 NaN 等于任何其他 NaN 是没有意义的。

同样你不能说Double::NEGATIVE_INFINITY 等于它自己,因为无穷大也不是一个数字。

【讨论】:

    【解决方案3】:

    如果任一操作数为 NaN,则相等运算符 == 返回 false。

    JSL 说关于 NaN:

    • 如果一个或两个操作数都是 NaN,则数值比较运算符 和 >= 返回 false(第 15.20.1 节)。
    • 如果任一操作数为 NaN,则相等运算符 == 返回 false。
    • 特别是,如果 x 或 y 为 NaN,则 (x=y) 将为假。
    • 如果任一操作数为 NaN(第 15.21.1 节),则不等式运算符 != 返回 true。

    特别是,x!=x 当且仅当 x 为 NaN 时为真。

    【讨论】:

      【解决方案4】:

      NaN - 非数字在使用 NAN 数字进行操作时没有任何意义。所以不能相等。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-01-19
        • 1970-01-01
        • 1970-01-01
        • 2015-04-05
        • 2012-11-30
        • 2012-10-16
        • 2011-07-06
        • 1970-01-01
        相关资源
        最近更新 更多