1. float类型的表示:
https://www.cnblogs.com/cppskill/p/5487425.html
float一共32位,其结构定义如下:
|- 31-|----- 30-23 ----- |-------------- 22-0 --------------|
符号位(sign) 指数部分(exp) 小数部分(mag)
sign:符号位就一位,0表示正数,1表示负数
exp: 指数部分,无符号正数
mag:小数部分,定点小数,小数点在最左边。
float的表达式 : pow(-1,sign) * (1+mag) * pow(2,exp-127)
当阶码E为全0且尾数M也为全0时,表示的真值X为零,结合符号位S为0或1,有正零和负零之分。当阶码E为全1且尾数M也为全0时,表示的真值X为无穷大(∞),结合符号位S为0或1,有+∞和-∞之分。这样,在32位浮点数表示中,要除去E用全0和全1(255)表示零和无穷大的特殊情况,因此,阶码E的取值范围变为1~254,指数的偏移量不选128(10000000B),而选127(01111111B)。对于32位规格化浮点数,真正的指数值e为-126~+127,因此,数的绝对值的范围是2^-126~2^127≈10-38~1038。
实数转二进制float类型的方法:
A. 分别将实数的整数和小数转换为二进制
B. 左移或者右移小数点到第一个有效数字之后
C. 从小数点后第一位开始数出23位填充到尾数部分
D. 把小数点移动的位数,左移为正,右移为负,加上偏移量127,将所得的和转换为二进制填充到指数部分
E. 根据实数的正负来填充符号位,0为正,1为负
2. thrust::sort_by_key可以直接排序两个长度相同的数组,不需要放到struct里作为一个数组来排序!