2017-02-21 15 views
9

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); 
} 

Odpowiedz

5

Ponieważ są zawsze dodając 4096 kod robi zaokrąglania w połowie drogi przypadki kierunku dodatnim nieskończoności. To trochę dziwne.

Aby zaokrąglić w kierunku dodatnim nieskończoność, będę oczekiwać

temp += 4096 + 4095; 

Aby zaokrąglić w zwykły sposób (w zaokrągleniu), użyj zamiast dodać nastawienie od 0.

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

Aby zaokrąglić do najbliższych i więzi, aby nawet więcej pracy. Nie taki OP chce tego.