Lucene: 6.5.1
在DocValue中存储数值类类型的数据时,往往会将double/float转换成Long进行存储。
其中可以参考Class NumbericUtils。我们以double2Long为示例:
public static long doubleToSortableLong(double value) {
return sortableDoubleBits(Double.doubleToLongBits(value));
}
public static long sortableDoubleBits(long bits) {
return bits ^ bits >> 63 & 9223372036854775807L;
}
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;
}
1)将double转换成LongBits
doubleToLongBits方法根据 IEEE 754 浮点双精度格式 (“double format”) 位布局,返回指定浮点值的表示形式。
输入:双精度浮点数
输出:表示浮点数的位
返回值的组成:
①第1位是数符s,s=1表示负数,s=0表示正数。
②第2-12位为阶码E
③第13-64位为尾数M
示例
22.8125等于二进制10110.1101
22.8125—>10110.1101–>1.01101101* 2^4
双精度:S=0,E=4+1023=1027(10位) M=0.01101101 (53位)
ans=0 1000000011 01101101000000000000000000000000000000000000000000000
2)转化成SortableLong
操作如代码所示