负数的定点乘法

Fixed point multiplication of negative numbers

我有以下方法将两个 32 位数定点相乘 19.13 格式。但是我觉得这个方法有问题:

1.5f 向上舍入为 2.0f,而 -1.5f 向上舍入为 -1.0f.

我觉得 -1.5 应该四舍五入到 -2.0f

首先,当前的舍入是否有意义,如果没有,我该如何改变它 更一致?

static OPJ_INT32 opj_int_fix_mul(OPJ_INT32 a, OPJ_INT32 b) {
    OPJ_INT64 temp = (OPJ_INT64) a * (OPJ_INT64) b ;
   temp += 4096;
   assert((temp >> 13) <= (OPJ_INT64)0x7FFFFFFF);
   assert((temp >> 13) >= (-(OPJ_INT64)0x7FFFFFFF - (OPJ_INT64)1));
   return (OPJ_INT32) (temp >> 13);
}

由于您总是添加 4096,代码正在将中途情况舍入到正无穷大。这有点奇怪。

为了向正无穷大舍入,我期望

temp += 4096 + 4095;

要以通常的方式四舍五入(最接近),请改为添加远离 0 的偏差。

temp += (temp < 0) ? -4096 : 4096;

四舍五入到最接近,并列到偶数是更多的工作。不确定 OP 希望如此。