2010-05-26 27 views
2

假設這麼多:
我正在使用16.16定點系統。
系統是32位。
CPU沒有浮點處理器。
對於任何大於1.0的任何乘法,溢出相當迫在眉睫* 0.4999定點乘法「解決方案」,瘋狂還是可行?

最後一個假設......可以說我正在工作的值不會太高,導致此操作溢出......

//assume that in practical application 
//this assignment wouldn't be here as 2 fixed values would already exist... 
fixed1 = (int)(1.2341 * 65536); 
fixed2 = (int)(0.7854 * 65536); 

mask1 = fixed1 & 0xFF; //mask off lower 8 bits 

fixed1 >>= 8; //keep upper 24 bits... assume value here isn't too large... 

answer = (((fixed2 * fixed1) >> 8) + ((fixed2 * mask1) >> 16)); 

所以,問題是......這是神來之筆(不是說出來的尚未想到的或任何東西),或者完全是浪費時間?

+1

嗯,我一個人不明白你在這裏要做什麼。 您是否試圖在沒有浮點處理器的32位計算機上將1.2341乘以0.7854,但是所有數字都是固定的,以便前16位爲小數點前,而後16位爲小數點後? – ChrisBD 2010-05-26 15:26:33

回答

1

重新編輯 - 因爲我錯了:)

看起來你正在嘗試使用一個額外的變種來獲得更高的精度?

如果你真的想提高精度,那麼這將工作,但爲什麼不使用整個int而不是8位?

好的,從您的意見中,您想知道如何在32位處理器上執行64位精度muls。最簡單的方法是,如果你下面的處理器有很長的乘法運算。如果它是一個ARM,那麼你很幸運,並且可以用很長的時間來完成你的多任務,然後轉移你的低位並完成。

如果沒有,你仍然可以做很長時間的繁殖,並讓編譯器編寫者爲你處理溢出問題。這些是最簡單的方法。

如果做不到這一點,你做的4個16位乘法和一堆增加和轉變:


// The idea is to break the 32-bit multiply into 4 16-bit 
parts to prevent any overflow. You can break any 
multiply into factors and additions (all math here is unsigned): 
     (ahi16)(alo16) 
X  (bhi16)(blo16) 
-------------------- 
     (blo16)(alo16) - First 32-bit product var 
    (blo16)(ahi16)<&lt16 - Second 32-bit product var (Don't shift here) 
    (bhi16)(alo16)<&lt16 - Third 32-bit product var (Don't shift here) 
+ (bhi16)(ahi16)<&lt32 - Forth 32-bit product var (Don't shift here) 
-------------------- 
Final Value. Here we add using add and add 
with carry techniques to allow overflow. 

基本上,我們有一個較低的產品和高產品的低的產品被分配在第一部分產品。然後添加2箇中間產品向上移動16.對於每個溢出,您將1添加到高產品並繼續。然後將每個中間產品的高16位添加到高產品中。最後,將最後一個產品按原樣添加到高級產品中。

屁股很大的痛苦,但它適用於任何價值的abitrary精度。

+0

這編譯並給出了預期的答案,所以不......答案不會出錯。是的,如果這些值太大,這將絕​​對溢出。你可能錯過了fixed >> >> = 8 ......但這確實產生了一個正確的答案。 – Maximus 2010-05-26 15:45:59

+0

啊,你是對的,我錯過了最初的轉變。這完全改變了事情,是的 - 這會增加你的精確度。但是如果你打算花費一些額外的變量,不妨進一步使用它,並使用整個變量而不是僅僅8位。 – 2010-05-26 15:48:49

+0

謝謝邁克爾。你完全正確,這可能很容易溢出...我很粗略地使用類似的東西。總的問題,說實話...假設我不會溢出......這會比浮動*浮動更快嗎? – Maximus 2010-05-26 15:52:13