浮点运算转换成整数运算

2019-04-15 12:40发布

相比整数运算,浮点运算是很慢的,在效率要求很高的情形下,有时我们得转换成整数运算 如下面的表达式: void get_gray(int red, int green, int blue, int & gray) { gray = static_cast(red * 0.123 + green * 0.456 + blue * 0.421 + 0.5); } 可以转换为: gray = static_cast(red * 31.488 / 256 + green * 116.736 / 256 + blue * 107.776 / 256 + 128.0 / 256); gray = static_cast((red * 31.488 + green * 116.736 + blue * 107.776 + 128.0) / 256) 取近似的话: gray = (red * 31 + green * 117 + blue * 108 + 128) / 256 所以,在不考虑越界问题, 并假设两种方法的偏差是可容忍的情形下,可以转换为: void get_gray(int red, int green, int blue, int & gray) { gray = (red * 31 + green * 117 + blue * 108 + 128) >> 8; } 另外四舍五入时从偏差最大的开始舍入, 最后一个应由256减去其它的来得到, 以保证三者和为256