【问题标题】:Fixed point multiplication of negative numbers负数的定点乘法
【发布时间】:2017-02-21 19:32:06
【问题描述】:

我有以下方法在定点乘以两个 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);
}

【问题讨论】:

    标签: fixed-point


    【解决方案1】:

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

    我希望向正无穷大舍入

    temp += 4096 + 4095;
    

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

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

    四舍五入到最近并 到偶数是更多的工作。不确定 OP 是否希望这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多