2014-06-28 68 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); 

是我的問題的解決方案。感謝您的有用評論。