Java中的NaN混淆 [英] Confusion on NaN in Java

查看:155
本文介绍了Java中的NaN混淆的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  int i = 0,j = 0; 
double nan1 =(double)0/0;
double nan2 =(double)0/0;
double nan3 =(double)i / j;
System.out.println(Double.doubleToRawLongBits(nan1)== Double.doubleToRawLongBits(nan2));
System.out.println(Double.doubleToRawLongBits(nan1)== Double.doubleToRawLongBits((double)0/0));
System.out.println(Double.doubleToRawLongBits(nan3)== Double.doubleToRawLongBits(nan2));

输出:

  true 
true
false

请帮助我输出为前两个 true ,前一个为 false 。请告诉我什么是 Double.doubleToRawLongBits()方法的实际工作。

解决方案

请尝试运行以下代码来查看值:

  public class Test 
{
public static void main(String [] args){
int i = 0,j = 0;
double nan1 =(double)0/0;
double nan2 =(double)0/0;
double nan3 =(double)i / j;
System.out.println(Double.doubleToRawLongBits(nan1)+==+ Double.doubleToRawLongBits(nan2)+is+
(Double.doubleToRawLongBits(nan1)== Double.doubleToRawLongBits楠2)));
System.out.println(Double.doubleToRawLongBits(nan1)+==+ Double.doubleToRawLongBits((double)0/0)+is+
(Double.doubleToRawLongBits(nan1)= = Double.doubleToRawLongBits((double)0/0)));
System.out.println(Double.doubleToRawLongBits(nan3)+==+ Double.doubleToRawLongBits(nan2)+is+
(Double.doubleToRawLongBits(nan3)== Double.doubleToRawLongBits楠2)));





$ b $在我的Mac上,它产生如下输出: p>

  9221120237041090560 == 9221120237041090560 is true 
9221120237041090560 == 9221120237041090560 is true
-2251799813685248 == 9221120237041090560 is false

这个缺陷在Javadoc中有记载, doubleToRawLongBits方法

< blockquote>

如果参数是NaN,则结果是表示实际NaN值的长整数。与doubleToLongBits方法不同,doubleToRawLongBits不会将编码NaN的所有位模式折叠为单个规范NaN值。


int i = 0, j = 0;
double nan1 = (double)0/0;
double nan2 = (double)0/0;
double nan3 = (double)i/j;
System.out.println(Double.doubleToRawLongBits(nan1) == Double.doubleToRawLongBits(nan2));
System.out.println(Double.doubleToRawLongBits(nan1) == Double.doubleToRawLongBits((double)0/0));
System.out.println(Double.doubleToRawLongBits(nan3) == Double.doubleToRawLongBits(nan2));

output:

true
true
false

Please help me how the output came true for first two and false for last one. Please tell me what is actual work of Double.doubleToRawLongBits() method.

解决方案

Please try to run following code to see the values:

public class Test
{
    public static void main(String[] args){
        int i = 0, j = 0;
        double nan1 = (double)0/0;
        double nan2 = (double)0/0;
        double nan3 = (double)i/j;
        System.out.println(Double.doubleToRawLongBits(nan1) + " == "+ Double.doubleToRawLongBits(nan2) + " is " +
            (Double.doubleToRawLongBits(nan1) == Double.doubleToRawLongBits(nan2)));
        System.out.println(Double.doubleToRawLongBits(nan1) + " == "+ Double.doubleToRawLongBits((double)0/0) + " is " +
            (Double.doubleToRawLongBits(nan1) == Double.doubleToRawLongBits((double)0/0)));
        System.out.println(Double.doubleToRawLongBits(nan3) + " == "+ Double.doubleToRawLongBits(nan2) + " is " +
            (Double.doubleToRawLongBits(nan3) == Double.doubleToRawLongBits(nan2)));
    }
}

On my Mac, it produces following output:

9221120237041090560 == 9221120237041090560 is true
9221120237041090560 == 9221120237041090560 is true
-2251799813685248 == 9221120237041090560 is false

This pitfall is documented in the Javadoc for the doubleToRawLongBits method:

If the argument is NaN, the result is the long integer representing the actual NaN value. Unlike the doubleToLongBits method, doubleToRawLongBits does not collapse all the bit patterns encoding a NaN to a single "canonical" NaN value.

这篇关于Java中的NaN混淆的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆