我正在查看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
?
答案 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
的值为NaN
和Nan != NaN
。这似乎是合乎逻辑的,因为Math.sqrt(-1)
也会为您提供NaN
。
请参阅Double.NaN
的javadoc:
它等同于
返回的值Double.longBitsToDouble(0x7ff8000000000000L)
如果参数是
0x7ff0000000000001L
到0x7fffffffffffffffL
范围内或0xfff0000000000001L
到0xffffffffffffffffL
范围内的任何值,则结果为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。
它不仅仅是关于Java,对于遵循IEEE754标准的所有语言也是如此。
答案 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
时,它永远不等于它自己。