探索JDK

doubleToRawLongBits和Double.compa

2018-10-31  本文已影响0人  苏小小北

1. 前言


Double类中doubleToRawLongBits,double类型占64位,而long类型也是占64位,两个类型在计算机中存储的机器码都是64位二进制,从0和1的角度来看,是没有任何区别的。区别在于,对应同一64位二进制机器码,两者的解析方式不同。

所以,在jdk中double类(float与int对应)中提供了double与long转换,doubleToRawLongBits就是将double转换为long,这个方法是原始方法(底层不是java实现,是c++实现的)

    public static native long doubleToRawLongBits(double value);

而doubleToRawLongBits转换时,value可能是NaN,这时候,doubleToRawLongBits还是会直接转换为对应的long,doubleToRawLong的可以允许非double数值转换,而doubleToLongBits经过了一次处理,将NaN的数值全部替换为0x7ff8000000000000L,这个就是两者的区别,

    public static long doubleToLongBits(double value) {
        long result = doubleToRawLongBits(value);
        // Check for NaN based on values of bit fields, maximum
        // exponent and nonzero significand.
        if ( ((result & DoubleConsts.EXP_BIT_MASK) ==
              DoubleConsts.EXP_BIT_MASK) &&
             (result & DoubleConsts.SIGNIF_BIT_MASK) != 0L)
            result = 0x7ff8000000000000L;
        return result;
    }

2. 用途


在Double类中,主要是compare(double d1, double d2)调用的doubleToRawLongBits方法,

compare(double d1, double d2):

先将double转为long类型,然后比较,那为什么能用long类型来比较呢,我们先看看两个正的浮点数比较d1和d2(大于0),转换后对应的long类型数值为l1,l2.
设d1的二进制组成:符号位为a_1,指数位为b_1,尾数位为c_1
设d2的二进制组成:符号位为a_2,指数位为b_2,尾数位为c_2

3.后言


假如两个浮点数都是负数,你会证明吗?

其他

本人也是在慢慢学习中,如有错误还请原谅、敬请指出,谢谢!

上一篇 下一篇

猜你喜欢

热点阅读