Optimizing a floating point division and conversion operation

algorithm, c, c++, floating-point

Solution

Pre-convert your divisions into a multiplicable constant:

a / 3 / 255

is the same as

a * (1 / (3 * 255))

so pre-compute:

const float AVERAGE_SCALE_FACTOR = 1.f / (3.f * 255.f)

then just do

float mean = (r + g + b) * AVERAGE_SCALE_FACTOR;

since multiplying is generally a lot faster than dividing.

Problem

I have the following formula ``` float mean = (r+b+g)/3/255.0f; ``` I want to speed it up. There are the following preconditions ``` 0<= mean <= 1 and 0 <= r,g,b <= 255 and r, g, b are unsigned chars ``` so if I try to use the fact that >> 8 is like dividing by 256 and I use something like ``` float mean = (float)(((r+b+g)/3) >> 8); ``` this will always return 0. Is there a way to skip the costly float division and still end up with a mean between 0 and 1?

Original source