负数的定点乘法

Jac*_*cko 9 fixed-point

我有以下方法以固定点19.13格式乘以两个32位数 .但我认为这种方法存在问题:

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);
}
Run Code Online (Sandbox Code Playgroud)

chu*_*ica 5

由于您总是在添加4096,因此代码正在将中间情况四舍五入到正无穷大.这有点奇怪.

为了实现正无穷大,我期待

temp += 4096 + 4095;
Run Code Online (Sandbox Code Playgroud)

要以通常的方式(最接近)进行舍入,请使用偏离0的偏移量.

temp += (temp < 0) ? -4096 : 4096;
Run Code Online (Sandbox Code Playgroud)

绕到最近并且偶数相关是更多的工作.不确定OP的愿望.