2012-05-07 36 views
4

要實現0到1之間的實數,通常使用ANSI浮點數或雙精度數。但是,0到1之間的固定精度數字(小數模1)可以有效地實現爲32位整數或16位字,它們與普通整數/字一樣添加,但會乘以「錯誤的方式」,這意味着當您乘以X次是的,你保留產品的高階位。這相當於乘以0.X和0.Y,其中X的所有位都在小數點後面。同樣,-1和1之間的帶符號數字也可以通過一個額外的位和一個移位來實現。裝配中的純高位乘法?

如何在C中實現固定精度的mod 1或mod 2(特別是使用MMX或SSE)? 我認爲這種表示方法可以用於酉矩陣的高效表示,用於數值密集的物理模擬。它使更多的MMX/SSE具有整數量,但您需要更高級別的PMULHW訪問權限。

回答

10

如果16位定點算術已經足夠,並且您在x86或類似架構上,則可以直接使用SSE。

SSE3指令pmulhrsw在硬件中直接實現帶符號的0.15定點算術乘法(mod 2,因爲您稱它爲-1 .. + 1)。加法與標準的16位向量操作沒有什麼不同,只是使用了paddw

因此,這一次處理乘法和加法八個符號16個定點變量庫看起來是這樣的:

typedef __v8hi fixed16_t; 

fixed16_t mul(fixed16_t a, fixed16_t b) { 
    return _mm_mulhrs_epi16(a,b); 
} 

fixed16_t add(fixed16_t a, fixed16_t b) { 
    return _mm_add_epi16(a,b); 
} 

權限授予以任何方式使用它,你喜歡;-)

+0

非常感謝。 –