要实现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访问权限。
答案 0 :(得分:10)
如果16位定点运算已足够且您使用的是x86或类似的架构,则可以直接使用SSE。
SSE3指令pmulhrsw
直接在硬件中实现带符号的0.15定点算术乘法(你称之为mod 2,从-1 .. + 1)。添加与标准16位向量操作没有什么不同,只是使用paddw
。
因此,一次处理乘法和添加8个有符号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);
}
允许以您喜欢的任何方式使用它; - )