avr-gcc i liczby zmiennoprzecinkowe

Aug 26, 2003 2 Replies

Napisalem prosty programik np:



#define __AVR_ATmega8__ #include <avr\io.h>


int main(void) { unsigned char a while(1) { for(a=0;a<=200;a++) PORTB=a; } }



Po skompilowaniu plik hex ma rozmiar 342 bajty. Spoko. Ale juz program:



int main(void) { unsigned char a; float b; while(1) { for(a=0;a<=200;a++) a= 33.455*a; } } liczy sobie ponad 10k w pliku hex. Dlaczego tak duzo.



Czy cos robie nie tak przy komilacji? Pewnie trzeba wlaczyc jakies opcje kompilatora, o ktorych nie wiem. Zauwazylem, ze plik *.lss zawiera cale mnostwo jakich procedur do obrobki liczb zmiennoprzecinkowych.



jacek


W artykule <bife22$j55$ snipped-for-privacy@nemesis.news.tpi.pl> Jack00 napisal(a):

Kompilator dołożył automatycznie bibliotekę obsługi liczb zmiennoprzecinkowych. Tyle waży i już :-(

Pozdrawiam

Marcin Stanisz

Jack00 napisal(a):

To wina wlaczenia biblioteki do floatow. Nie korzystaj z floatow jesli nie musisz! Wielokrotnie mozna z powodzeniem uniknac floatow stosujac liczby typu int czy long, zmieniajac kolejnosc dzialan czy rozbijajac liczby na skladowe. Mozna to zrobic nastepujaco jesli czesc ulamkowa mozesz zignorowac: b = (33455*a)/1000; (Byc moze nawiasy sa niepotrzebne, ale nigdy nie pamietam kolejnosci dzialan ;--) )

lub po prostu b = 33455 * a; po przeskalowaniu wyniku. b jest typu long.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required