负数的定点乘法
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 希望如此。
我有以下方法将两个 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 希望如此。