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?