我有以下方法以固定点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)
由于您总是在添加4096,因此代码正在将中间情况四舍五入到正无穷大.这有点奇怪.
为了实现正无穷大,我期待
temp += 4096 + 4095;
Run Code Online (Sandbox Code Playgroud)
要以通常的方式(最接近)进行舍入,请使用偏离0的偏移量.
temp += (temp < 0) ? -4096 : 4096;
Run Code Online (Sandbox Code Playgroud)
绕到最近并且与偶数相关是更多的工作.不确定OP的愿望.