5

为了实现 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。

4

1 回答 1

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);
}

允许以您喜欢的任何方式使用它;-)

于 2012-05-07T08:21:39.310 回答