Stránka 1 z 1

Pevná řádová čárka

Napsal: 14 pro 2012, 09:37
od Mimar
Ahoj. Potřeboval bych poradit s výpočty v pevné řádové čárce. Aktuálně se snažím rozchodit násobení celého čísla číslem desetinným, dejme tomu např. 853 * -0,425. Pro zobrazení desetinného čísla se běžně na 16ti bitových MCU používá formát Q15, tedy nejvyšší bit nese znaménko a následující už vlastní hodnotu. Protože počítám jak s celými čísly, tak desetinnými, chtěl jsem aplikovat formát Q15.16, kdy by informaci o znaménku nesla celá část. A teď, co jsem ne zcela pochopil: jak v tomto formátu zakódovat těch -0,425. Když nastavím MSB celé části do jedničky (= záporné číslo), a zbývající bity do nuly, nebude celá část rovna nule, ale dle dvojkového doplňku -32768. Jediné, co mě napadlo, by bylo se na dvojkový doplněk vykašlat a hold mít dvě nuly, zápornou a kladnou. Ještě mě napadlo použít strukturu s dvěma položkami: celou částí a desetinnou částí, kdy by každá z nich měla znaménkový bit. Nemáte někdo více zkušeností s pevnou řádovou čárkou, každá informace dobrá. Děkuji moc.

Napsal: 14 pro 2012, 09:58
od piitr
Já bych to zapsal jako: FFFF9333
Došel jsem k tomu takto:
[(-0,425) + 65536] * 65536
Převedeno na hexa.
Musel jsem to trochu zaokrouhlit.

Napsal: 14 pro 2012, 15:00
od AB1
Vynásob číslem 1000x větším a ve výsledku posuň desetinnou tečku o 3 místa doleva.

Kód: Vybrat vše

//avr-gcc
int32_t x, cela_cast, tisiciny;
char string[9];

int main()
{
  
//  x = 853 * -0,425           // -362,525

    x = 853L * -425;          // -362525
    cela_cast = x/1000;        // -362
    tisiciny  = labs(x%1000);  //  525

    sprintf(string,"%ld.%03ld",cela_cast, tisiciny); //string = "-362.525"