avr-gcc i liczby zmiennoprzecinkowe

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

Reply to
Jack00
Loading thread data ...

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

Reply to
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.

Reply to
Marcin E. Hamerla

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.