美文网首页探索JDK
doubleToRawLongBits和Double.compa

doubleToRawLongBits和Double.compa

作者: 苏小小北 | 来源:发表于2018-10-31 18:24 被阅读0次

1. 前言


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

  • long:按整数类型来解析,也是我们常见的类似“个十百千...”位来存储的,例如13
    13 = 1*2^0 + 0*2^1+1*2^2+1*2^3
    所以13的二进制位0...1101(...代表省略了64-5=59个零)
  • double:按浮点类型来解析,按IEEE754标准,详细见IEEE 754 浮点类型表示
    64位:符号位,共1位
    53-63位:指数位,共11位
    1-52位:尾数位,共52位

所以,在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

  • 如果d1==d2(double类型数值相等):对应的long类型数值也必然相等
  • 如果d1 > d2(double类型数值不同):
    都是正数,a_1 == a_2,主要看b_1, b_2, c_1, c_2
    那么double类型数值表示
    d1=(1+c_1) * 2 ^ {b_1}
    d2=(1+c_2) * 2 ^ {b_2}
    d1 > d2
    (1+c_1) * 2 ^ {b_1} > (1+c_2) * 2 ^ {b_2}
    要保证上式成立,假设b_1 < b_2
    (1+c_1) * 2 ^ {b_1} < 2^{b_1+1}
    (1+c_2) * 2 ^ {b_2} > 2^{b_2}
    所以有
    2^{b_1+1} > 2^{b_2}
    上式是不成立的,所以有且只有b_1 >= b_2,那么此时对应的long类型数值肯定是l1 >= l2(是否相同要看最后的尾数是否相同)
    如果b_1 = b_2,那么就看尾数位大小,尾数位大小与对应的long类型大小一致。
  • 如果d1 < d2,证明同上

3.后言


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

其他

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

相关文章

网友评论

    本文标题:doubleToRawLongBits和Double.compa

    本文链接:https://www.haomeiwen.com/subject/rpoatqtx.html