Java是不是它的工作原理?

我正在查看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时,我无法理解它是如何工作的?

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

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

基本上, NaN代表未定义的值。 0.0 / 0.0的值是NaN ,并且Nan != NaN 。 它似乎是合乎逻辑的,因为Math.sqrt(-1)也给你NaN

请参阅Double.NaN的javadoc:

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

然后是Double.longBitsToDouble()

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

来自Java语言规范 :

浮点相等测试根据IEEE 754标准的规则执行:

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

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

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

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

与NaN进行比较时,即使与自身进行比较,也会返回无序结果。 …相等和不等式谓词是非信令的,因此x = x返回false可用于测试x是否是安静的NaN。

资源

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

相关问题: 为什么Double.NaN == Double.NaN返回false?

简单.. Nan总是!= NaN ,这些值不等于任何东西。 看到这个 :

如已经描述的那样,NaN是无序的,因此涉及一个或两个NaN的数字比较操作返回false,并且涉及NaN的任何!=比较返回true, 包括当x是NaN时x!= x

因此测试v != v是否足以判断该value是否为NaN

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