2017-02-21 4 views
9

Ich habe die folgende Methode, um zwei 32-Bit-Zahlen im Fixpunkt 19.13 Format zu multiplizieren. Aber ich denke, es gibt ein Problem mit dieser Methode:Festkomma-Multiplikation von negativen Zahlen

1.5f ist auf 2.0f aufgerundet, während -1.5f auf -1.0f aufgerundet wird.

Es scheint mir, dass -1.5 auf -2.0f abgerundet werden sollte.

Erstens macht die aktuelle Rundung Sinn, und wenn nicht, wie kann ich sie ändern , um konsistenter zu sein?

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

Antwort

5

Da Sie immer 4096 hinzufügen, macht der Code Rundungen auf halbem Weg zur positiven Unendlichkeit. Es ist irgendwie komisch.

Zur Abrundung zu positiv unendlich, würde ich erwarten

temp += 4096 + 4095; 

Um die übliche Art und Weise rundet in (zum nächsten), verwenden Sie stattdessen eine Vorspannung hinzufügen weg von 0.

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

Zur Abrundung zum nächsten und Bindungen zu sogar ist mehr Arbeit. Nicht sicher, OP wünscht das.

Verwandte Themen