我刚才有一个我无法回答的问题.
假设您在Java中使用此循环定义:
while (i == i) ;
如果循环不是无限循环并且程序只使用一个线程i
,i
那么类型和值是什么?
double i = Double.NaN;
Double.equals()的API解释了答案:"Double.NaN == Double.NaN的值为false".这在Java语言规范" 浮点类型,格式和值 "下详细说明:
NaN
是无序的,所以数值比较运算<
,<=
,>
,和>=
返回false
如果任一或两个操作数都NaN
.等于运算符==
将返回false
如果操作数是NaN
和不平等操作!=
返回true
如果操作数是NaN
.尤其x!=x
是true
当且仅当x
是NaN
,和(x
将是=y) false
,如果x
和y
是NaN
.
i
那么值是无效的."不是数字".
经过一些谷歌搜索,我发现你可以在Java中拥有NaN(非数字)!因此,浮点数是数据类型,值是NaN.看到这里
double i = Double.NaN;
NaN不等于任何东西,包括它自己.
float i = Float.NaN; while(i == i) ; System.out.println("Not infinite!");
我不确定,但我相信(i == i)在多线程进程中不是原子操作,所以如果我的值会被其他线程在推送它的值之间改变,在执行循环的线程上堆栈,那么那个条件可以是假的.
由于其他人说它是NaN,我对官方(JDK 6)的实施感到好奇Double.isNaN
,并且看到:
/** * Returnstrue
if the specified number is a * Not-a-Number (NaN) value,false
otherwise. * * @param v the value to be tested. * @returntrue
if the value of the argument is NaN; *false
otherwise. */ static public boolean isNaN(double v) { return (v != v); }