Mam następujący sposób mnożenia dwóch liczb 32-bitowych w stałym punkcie w formacie 19.13
. Ale myślę, że jest problem z tą metodą:Mnożenie punktowe liczb ujemnych
1.5f
jest zaokrąglana do 2.0f
, a -1.5f
jest zaokrąglana do -1.0f
.
Wydaje mi się, że -1.5
należy zaokrąglić w dół do -2.0f
.
Po pierwsze, czy obecne zaokrąglenie ma sens, a jeśli nie, w jaki sposób mogę go zmienić? , aby był bardziej spójny?
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);
}