Java是不是它的工作原理?

时间:2013-08-26 10:58:33

标签: java floating-point nan

我正在查看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

5 个答案:

答案 0 :(得分:19)

该方法可以为某些操作返回 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()

  

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

答案 1 :(得分:3)

来自Java Language Specification

  

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

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

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

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

  •   

答案 2 :(得分:2)

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

  

与NaN的比较总是会返回无序结果,即使是   与自身比较。 ......平等和不平等的谓词是   非信令因此x = x返回false可用于测试x是否为a   安静的NaN。

Source

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

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

答案 3 :(得分:1)

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

  

正如已经描述的那样,NaN是无序的,所以是数字   涉及一个或两个NaN的比较操作返回false和any   !=涉及NaN的比较返回true,包括x!= x,当x为时   为NaN

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

答案 4 :(得分:0)

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