【问题标题】:Java isNan how it works?Java isNan 是如何工作的?
【发布时间】:2013-08-28 20:19:33
【问题描述】:

我在看openjdk-1.7.0_25源代码,看到了这个方法:

/**
 * Returns {@code true} if the specified number is a
 * Not-a-Number (NaN) value, {@code false} otherwise.
 *
 * @param   v   the value to be tested.
 * @return  {@code true} if the argument is NaN;
 *          {@code false} otherwise.
 */
static public boolean isNaN(float v) {
    return (v != v);
}

我不明白它是怎么工作的,这个方法什么时候可以返回true

【问题讨论】:

    标签: java floating-point nan


    【解决方案1】:

    该方法可以为某些操作返回true,例如:

    System.out.println(Float.isNaN(0.0f / 0.0f));
    System.out.println(Double.isNaN(Math.sqrt(-1)));
    

    基本上,NaN 代表一个未定义的值。 0.0 / 0.0 的值为NaNNan != NaN。这似乎是合乎逻辑的,因为Math.sqrt(-1) 也会给你NaN

    查看Double.NaN的javadoc:

    相当于Double.longBitsToDouble(0x7ff8000000000000L)返回的值

    然后Double.longBitsToDouble():

    如果参数是0x7ff0000000000001L0x7fffffffffffffffL0xfff0000000000001L0xffffffffffffffffL 范围内的任何值,则结果为NaN。 Java 提供的任何 IEEE 754 浮点运算都无法区分两个具有不同位模式的相同类型的 NaN 值。

    【讨论】:

    • 因此,只需少量操作就可以返回NaN,并且只需使用该值就可以返回true...好的,谢谢!
    • @rascio。是的,该方法将只为 NaN 参数返回 true。并且可能还有其他一些操作,它返回NaN。就像Double.POSITIVE_INFINITY / Double.POSITIVE_INFINITY,同样适用于负无穷。
    • @rascio 另外,不要忘记,如果您继续使用 NaN 值进行计算,则每个结果始终也是 NaN。所以理论上是的,实际上只有一小部分操作会生成NaN,但是如果你继续计算,每进一步的操作也会返回NaN
    • NaN 只是“此值是直接或间接使用不可能计算的结果计算的”的占位符。说一个无意义的答案等于另一个无意义的答案是没有意义的。
    【解决方案2】:

    来自Java Language Specification

    浮点相等性测试是按照 IEEE 754 标准的规则进行的:

    • 如果任一操作数为 NaN,则 == 的结果为假,但 != 的结果为真。实际上,当且仅当 x 的值为 NaN 时,测试 x!=x 为真。 (Float.isNaN 和 Double.isNaN 方法也可以用来测试一个值是否为 NaN。)

    • 正零和负零被认为是相等的。因此,例如,-0.0==0.0 为真。

    • 否则,相等运算符会认为两个不同的浮点值不相等。特别是,有一个值表示正无穷大,一个值表示负无穷大; each 仅与自身比较相等,并且 each 与所有其他值比较不相等。

    【讨论】:

      【解决方案3】:

      因为只有 NaN 将 false 与自身进行比较。因此,当您将 NaN 传递给该方法时,它将返回 true。

      与 NaN 的比较总是返回无序的结果,即使 和自己比较。 ... 等式和不等式谓词是 非信令所以 x = x 返回 false 可用于测试 x 是否为 安静的南。

      Source

      这不仅仅是关于 Java,对于所有遵循 IEEE754 标准的语言也是如此。

      相关问题:Why does Double.NaN==Double.NaN return false?

      【讨论】:

        【解决方案4】:

        简单.. Nan 总是 != NaN,这些值不等于任何值。见this

        如前所述,NaN 是无序的,所以一个数字 涉及一个或两个 NaN 的比较操作返回 false 和任何 != 涉及 NaN 的比较返回 true,包括 x!=x 当 x 为 NaN.

        所以测试v != v 是否足以判断value 是否为NaN

        【讨论】:

          【解决方案5】:

          据我所知NaN value不等于任何东西。所以当你通过float v时,它永远不等于它自己。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2015-11-15
            • 1970-01-01
            • 2016-06-15
            • 1970-01-01
            • 1970-01-01
            • 2017-09-08
            • 2010-09-29
            • 2012-09-19
            相关资源
            最近更新 更多