我有以下公式
float mean = (r+b+g)/3/255.0f;
我想加快速度。有以下前提条件
0<= mean <= 1 and 0 <= r,g,b <= 255 and r, g, b are unsigned chars
所以如果我尝试使用这样一个事实 >> 8 就像除以 256 并且我使用类似
float mean = (float)(((r+b+g)/3) >> 8);
这将始终返回 0。有没有一种方法可以跳过代价高昂的 float 除法并最终得到介于 0 和 1 之间的平均值?
最佳答案
将除法预先转换为可乘常数:
a / 3 / 255
与
相同a * (1 / (3 * 255))
所以预先计算:
const float AVERAGE_SCALE_FACTOR = 1.f / (3.f * 255.f)
然后就去做
float mean = (r + g + b) * AVERAGE_SCALE_FACTOR;
因为乘法通常比除法快得多。
关于c++ - 优化浮点除法和转换操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1366437/