最近遇到了一个不同的机器上浮点数计算出来的小数部分不一致的问题
(主要是D3D里面提供的一些函数,如D3DXVec2Normalize)
在AMD的cpu跟intel的cpu上计算的结果会不一致
这里选择了一种保留到小数点后2的-3次方的截断方式(当然,也可以保留的更精确一点)
先上代码
float Floor3(float& f)
{
int& i = (int&)f;
int exp= (i & 0x7f800000) << 1; //取指数位,计算整数部分有多少位cutPos
int cutPos=((exp >> 24) & 0xff) - 127;
if (cutPos < -3)
{
f = 0.0f; // 2进制位底数部分前3位都为0,(即实际值小于0.125),近似为0
}
else
{
i = i & (~((1 << (23 - cutPos - 3)) - 1)); //-3即要保留到2的负几次方
}
return f;
}
实际上,相当于 对小数部分进行分段
.0 ~ .124999 的截断近似为.0
.125 ~ .249999的截断近似为.125
.25 ~ .374999的截断近似为.25
依此类推