2014-06-28 25 views
0

我写的一个算法,其中我需要执行以下操作:减少舍入误差与整数除法

double newval=(fg*(double)(0xFF-alpha))/256.0 + (bg*(double)alpha)/256.0; 

α,FG和BG是0-255之间的值。由于性能的原因,我想将它作为一个整数值的解决方案来实现。所以它看起来像这样:

int offset = 1; 
if (alpha == 0 || alpha == 256 || fg == 0 || bg == 0) 
offset = 0; 
int intval = offset + (((fg*(0xFF-alpha)) + (bg*alpha))>>8); 

我与α,FG和BG和获得8388607对与1

的舍入误差我在寻找可能性每一个可能的组合测试了这个减少误差为1的对的数量并将其保持为整数运算。预先感谢您的建议。

+1

8,338,607正好比可能组合的一半少1。你确定了哪些值的组合会导致错误?应该有一种模式 - 我的猜测是这与一个论点的平等性有关。 –

+4

如果你想正确舍入,在除以256之前加128. – Casey

+0

非常感谢你们俩。 128提示解决了我的问题。 –

回答

0
int intval = 1 + ((-128+(fg*(0xFF-alpha)) + (bg*alpha))>>8); 

是我的问题的解决方案。感谢您的有用评论。