最快判断整数是否2的指数次:
bool isPow2(unsigned int x)
{
return ((x&(x-1))==0);
}
找出一个16位的整数的大于该数的最小2的整数次的数。
unsigned int nextPow2( unsigned int x ) {
--x;
x |= x >> 1;
x |= x >> 2;
x |= x >> 4;
x |= x >> 8;
x |= x >> 16;
return ++x;
}
多个浮点数累加时减少精度损失的代码:
T reduceCPU(T *data, int size)
{
T sum = data[0];
T c = (T)0.0;
for (int i = 1; i < size; i++)
{
T y = data[i] - c;
T t = sum + y;
c = (t - sum) - y;
sum = t;
}
return sum;
}
浮点数累加时,执行下面操作:
1)把两个被加数的指数对其道大的数上.(保证第2步的正确且不溢出)
2)累加.
问题就在,如果两个被加数的指数差的很多的话,小的那个(data[i])的实际精度就下降了!
上面的把每次因精度引起的误差记录下来,反映到下次累加上,所以,最后的结果可以更准确.