FastFloatToInt操作原理?
书上说,对于x87FPU,浮点到整数的转换操作(截断取整)非常耗时。因为x87对浮点数默认取整为最接近的整数(舍入取整),所以对于每次转化,x87 FPCW都需要改变2次,开销很大。接着,书中提出了一种快速转换的近似方法(f为正浮点)
#define FLOAT_FTOI_MAGIC_NUM (float)(3 < < 21)
#define IT_FTOI_MAGIC_NUM 0x4ac00000
#define tag
int FastFloatToInt(float f)
{
f += FLOAT_FTOI_MAGIC_NUM;
return (*((int*)&f) - IT_FTOI_MAGIC_NUM) > > 1;
}
虽然对float浮点格式有所了解,我还是看不太明白上面的代码。
请高手指点一二。
[解决办法]
貌似他这个只有对 f < (1 < <23) - (3 < <21) 的数据精度比较高, 大了以后就错了 ...
对小于 ((1 < <23)-(3 < <21)) 的正浮点数,加上 (3 < <21) 不会影响结果的阶码 ...
偶觉得还不如这样简单又精度高,同时没有任何浮点运算, 不过是截断的, 不是舍入的 ...
int FastFloatToInt2( float f )
{
int x , p , a ;
x = *(int*)&f ,p=(x> > 23)-127,a=((x&0x7fffff)|0x800000);
return p <0?0:p> =23?a < <(p-23):a> > (23-p);
}