Zdravím , potřeboval bych v C pro AVRko napsat kód, který by násobil celočíselnou proměnou typu int konstantou která má však desetinou část. A výsledek by se opět převedl na celočíselnou proměnou typu int (desetinná část za se zahodila). Jak by jste to řešili vy, aby byl výsledný program dobře optimalizovaný? Mám sice nějaké nápady, ale nejsem si jist zda jsou zcela správné.
Díky.
co třeba:[code]
float konstanta;
int cislo;
cislo= (int)(cislo*konstanta);
[/code]
nebo:
[code]
float konstanta;
float pomocna;
int cislo;
pomocna=cislo*konstanta;
cislo=(int)pomocna;[/code]
Takže když násobím float*int výsledek je typu float?
#DEFINE KONST1 123456 // 1000* KONST 123.456
uint32_t a;
uint16_t b, c;
a = (uint32_t)b * KONST1;
a = a/1000;
c = (uint16_t)a;
Taky bych to provedl jako martin. Bez floatu se dá téměř vždy obejít a tady rozhodně.
Jen bych pro rychlejší výpočet násobil onu konstantu mocninou dvojky a tou poté nakonec dělil nebo použil bitový posun (gcc většinou rozpozná dělení mocninou dvojky a zoptimalizuje ho správně i sám).
Mám v tomto ohledu zkušenosti je CodeVisionem a MPlab C18 - výsledek aritmetické operace prováděné s různými datovými typy je vždy tom větším:
int * float = float
int * char = int
atd…
problém ale ale nastane, když chceš nacpat větší typ do menšího
[code]int a=10;
float b=37.25478845;
int c;
c=a*b; //tady ti určitě překladač vyhodí chybu, nebo aspoň varování - i když - MPlab si s tím hlavu neláme[/code]
proto je nutné přetypování
c=(int)(a*b);
jiné to ale je při kopírování proměnných
int a= 0xFA15;
int b;
char c;
c=a; // c bude mít hodnotu 0x15
b=c; // b bude mít hodnotu 0x0015
nebo
c=0xFFCD124A; // c bude mít hodnotu 0x4A
překladač nikterak neprotestuje