C programmering: konstanter i float --> int
Postat: 14 oktober 2013, 09:39:35
Jag anger gärna parametrar i C-program som flyttal, eftersom det är snyggast och det kan räknas på utan att man tappar i noggrannhet. T.ex
och använder sedan detta i olika jämförelser med heltalsvariabler, t.ex:
Problemet är att kompilatorn (GCC) då omvandlar heltalet till float innan jämförelsen, så för att undvika detta måste jag lägga till en typomvandling i if-satsen:
och det är här nånstans jag tycker det börjar bli lite 'ful'-kod. Risken är väldigt stor att jag glömmer att göra typomvandlingen på flera ställen och att kompilatorn därmed börjar utföra operationer i float istället för i int. Jag skulle vilja ha ett smartare sätt at skriva på , som dels ger mig möjligheten att ange konstanter i float, men att de ändå tolkas som int när man jobbar med dem. Tydligast i koden är väl om jag gör typomvandlingen i if-satsen (som ovan), så att man verkligen ser vilka typer man jobbar med, men finns det då något sätt att ta reda på om det utförs operationer eller jämförelser i float utan att behöva lusläsa hela koden? Nån slags kodanalysator som lämnar lite statistik på vilka operatorer som används och på vilka typer?
(Ett annat typiskt exempel där jag vill använda float men inte räkna i float är om jag vill multiplicera ett heltaltal med en liten konstant:
Här måste jag ändå se till att använda uint32_t istället för uint16_t om jag inte ska få overflow, så där ska ju typomvandlingen vara tydlig och synlig för att undanröja alla tvivel.)[/color][/i]
Kod: Markera allt
#define HV_LADDSTOP 185.6 // volt
Kod: Markera allt
uint16_t high_volt; // battierspänning i volt*10 (t.ex. 1234 = 123.4 volt)
if (high_volt > HV_LADDSTOP_VOLT*10) { ... }
Kod: Markera allt
if (high_volt > (uint16_t)(HV_LADDSTOP_VOLT*10))
(Ett annat typiskt exempel där jag vill använda float men inte räkna i float är om jag vill multiplicera ett heltaltal med en liten konstant:
Kod: Markera allt
#define KONSTANT 0.777 // talet ska multipliceras med denna konstant
uint16_t input_data;
uint16_t high_volt;
high_volt = (input_data * (uint32_t)(KONSTANT *65536)) / 65536; // multiplicera med konstant