一尘不染

优化浮点除法和转换操​​作

algorithm

我有以下公式

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。是否可以跳过昂贵的浮点除法,而仍然以0到1之间的均值结束?


阅读 298

收藏
2020-07-28

共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;

因为乘法通常比除法快得多。

2020-07-28