使用整数除法减少舍入错误

Reduce round-off Error with integer division

本文关键字:舍入 错误 除法 整数      更新时间:2023-10-16

我写了一个算法,我需要做以下事情:

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

alpha, 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);

我用alpha, fg和bg的每种可能组合进行了测试,得到了8,388,607对,舍入误差为1。

我正在寻找减少误差为1的配对数量的可能性,并将其保持为整数操作。提前感谢您的建议

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

是解决我问题的方法。谢谢你的宝贵意见。