2013-12-12 36 views
0
int8_t a; 
int8_t b; 
int8_t result; 
result = (a*coeff) + b*(1-coeff); 

現在這coeff必須是0.5,但我不能存儲浮動,因爲內存限制。有沒有辦法可以執行以上操作?我們可以通過除以兩個整數來得到一個浮點數答案嗎?

感謝

+2

你可以用'(a + b)/ 2'得到類似的東西,這是你想要的嗎?對於其他係數,您可以查找與其近似的理性值。 – Guido

+0

@Guido:0.5是一個任意數字。它可以是0.6,0.7 –

+0

假設它是0.7。我們可以通過這樣做(a * 7 + b *(10-7))/ 10。如果我們用'c1/c2'近似'coeff',則可以計算出'(a * c1 + b *(c2-c1))/ c2'。如果在編譯時不知道coeff,則會變得棘手。 – Guido

回答

4

聽起來好像fixed-point math是您需要的答案。在固定點,你決定你想放棄多少你的整數大小。然後你將小數點(以10爲底數的小數點)移到許多地方(通常是二進制)。

所以,如果你想有一個0.25的決議你會轉移2位。在一個16位整數中,可將範圍從32678減少到8192.

+0

還要注意,通過在更大的數據類型中執行數學可以減少範圍縮減(所以在OP的情況下,切換到「int16_t」以獲得中間值)。 –

+0

我想在這裏理解你的邏輯。所以如果我轉移到int16_t,0.6是coeff,我們如何計算轉移。對不起,我不明白這部分 –

+0

@UnderDog:例如,你可以乘以'154'(即圓(2^8 * 0.6)),然後右移結果8。 –

0

如果coeff已經是一個浮點類型,那麼一切都很好。涉及它的表達式將轉換爲浮點類型,最終結果將轉換回int

+0

編號coeff不是浮點數,我不能存儲浮點數。 –

+0

看來你可能想告訴我們更多關於你的具體平臺。雖然定點數學可能是一個候選人。 – Bart

+0

定點數學應該起作用(至少看起來像是這樣)。我正試圖理解如何實現它。 (@ Zan的回答) –

0

您可能會發現rational number library是一個有用的東西。這將數字存儲爲整數的比率,如1/4或255/256。

相關問題