Pevná řádová čárka

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
Mimar
Příspěvky: 45
Registrován: 01 bře 2011, 01:00
Bydliště: České Budějovice

Pevná řádová čárka

#1 Příspěvek 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.

Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 02:00
Kontaktovat uživatele:

#2 Příspěvek 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.

Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 01:00

#3 Příspěvek 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"

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“