Confusion on NaN in Java

后端 未结 4 1128
深忆病人
深忆病人 2020-12-29 08:22
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.doub         


        
4条回答
  •  萌比男神i
    2020-12-29 08:43

    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.

提交回复
热议问题