为了实现 0 到 1 之间的实数,通常使用 ANSI 浮点数或双精度数。但是 0 到 1 之间的固定精度数字(小数模 1)可以有效地实现为 32 位整数或 16 位字,它们像普通整数/字一样相加,但乘以“错误的方式”,这意味着当您乘以 X 倍时Y,您保留产品的高位。这相当于 0.X 和 0.Y 相乘,其中 X 的所有位都在小数点后面。同样,-1 和 1 之间的有符号数也可以通过这种方式通过一位额外的位和一位移位来实现。
如何在 C 中实现固定精度 mod 1 或 mod 2(尤其是使用 MMX 或 SSE)?
我认为这种表示对于酉矩阵的有效表示和数值密集型物理模拟很有用。它使更多的 MMX/SSE 具有整数数量,但您需要对 PMULHW 进行更高级别的访问。
如果 16 位定点运算就足够了,并且您使用的是 x86 或类似架构,则可以直接使用 SSE。
SSE3指令pmulhrsw
直接在硬件中实现有符号 0.15 定点算术乘法(模 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);
}
授予您以任何您喜欢的方式使用它的许可;-)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)