doubleToRawLongBits和Double.compa
2018-10-31 本文已影响0人
苏小小北
1. 前言
Double类中doubleToRawLongBits,double类型占64位,而long类型也是占64位,两个类型在计算机中存储的机器码都是64位二进制,从0和1的角度来看,是没有任何区别的。区别在于,对应同一64位二进制机器码,两者的解析方式不同。
- long:按整数类型来解析,也是我们常见的类似“个十百千...”位来存储的,例如13
所以13的二进制位(...代表省略了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的数值全部替换为,这个就是两者的区别,
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的二进制组成:符号位为,指数位为,尾数位为
设d2的二进制组成:符号位为,指数位为,尾数位为
- 如果d1==d2(double类型数值相等):对应的long类型数值也必然相等
- 如果d1 > d2(double类型数值不同):
都是正数, == ,主要看
那么double类型数值表示
即
要保证上式成立,假设 < ,
所以有
上式是不成立的,所以有且只有,那么此时对应的long类型数值肯定是l1 >= l2(是否相同要看最后的尾数是否相同)
如果,那么就看尾数位大小,尾数位大小与对应的long类型大小一致。 - 如果d1 < d2,证明同上
3.后言
假如两个浮点数都是负数,你会证明吗?
其他
本人也是在慢慢学习中,如有错误还请原谅、敬请指出,谢谢!