Konvertera flyttal till heltal (Integer) i C
Konvertera flyttal till heltal (Integer) i C
Någon som har en ide hur man programmatiskt i C på enklast och snabbast (minst kod) sätt konverterar ett flyttal (IEEE-754) till Heltal/integer.
Har 0x42AE0000 vilket skall motsvara talet 87 (87.00)
Någon som har kul ideer.
Har 0x42AE0000 vilket skall motsvara talet 87 (87.00)
Någon som har kul ideer.
Re: Konvertera flyttal till heltal (Integer) i C
Enklast i c är:
Sedan får man hoppas c-kompilatorn har vettiga rutiner bakom.
Finns kanske genvägar om man känner till arkiteturen.
Ex https://software.intel.com/en-us/articl ... onversions
Och för cortex M4 med flyttalsdel.
http://infocenter.arm.com/help/index.js ... JJFAA.html
Kod: Markera allt
float input = 87.15
int output = (int)input.
Finns kanske genvägar om man känner till arkiteturen.
Ex https://software.intel.com/en-us/articl ... onversions
Och för cortex M4 med flyttalsdel.
http://infocenter.arm.com/help/index.js ... JJFAA.html
Re: Konvertera flyttal till heltal (Integer) i C
Generellt bör man skriva (för tal ≥ 0)
int output = (int)(input+0.5);
för att få korrekt avrundning, eftersom cast alltid innebär truncate.
int output = (int)(input+0.5);
för att få korrekt avrundning, eftersom cast alltid innebär truncate.
- Jan Almqvist
- Inlägg: 1581
- Blev medlem: 1 oktober 2013, 20:48:26
- Ort: Orust
Re: Konvertera flyttal till heltal (Integer) i C
Jag hade nog provat memcpy().
Edit: Provat i HMI Droid Studio.
Edit: Provat i HMI Droid Studio.
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Senast redigerad av Jan Almqvist 24 januari 2018, 18:44:58, redigerad totalt 1 gång.
Re: Konvertera flyttal till heltal (Integer) i C
Man kan prova memcpy(), men fungerar här gör det inte.
- Jan Almqvist
- Inlägg: 1581
- Blev medlem: 1 oktober 2013, 20:48:26
- Ort: Orust
Re: Konvertera flyttal till heltal (Integer) i C
Jag blev tvunget att titta i koden, det är memcpy() jag använder. Men det är ju ingen konvertering utan bara att man betraktar en float som en uint32_t.
- Jan Almqvist
- Inlägg: 1581
- Blev medlem: 1 oktober 2013, 20:48:26
- Ort: Orust
Re: Konvertera flyttal till heltal (Integer) i C
Om TS vill konvertera från heltalet 0x42AE0000 vilket motsvarar flyttalet 87 till heltalet 87 så räcker såklart inte mempy(). Då behövs det en type cast också. Läste slarvigt.
Re: Konvertera flyttal till heltal (Integer) i C
Ja, jag läser av ett modbus-register och får data i flyttalsformat, vilket är minst sagt opraktiskt, om man skall hantera det mera.
Speciellt i en liten mikrokontroller.
Speciellt i en liten mikrokontroller.
- Jan Almqvist
- Inlägg: 1581
- Blev medlem: 1 oktober 2013, 20:48:26
- Ort: Orust
Re: Konvertera flyttal till heltal (Integer) i C
Det går ju enkelt att maska fram mantissa och exponent och göra en egen optimerad omvandling antar jag. Formatet är inte så märkvärdigt.
https://en.wikipedia.org/wiki/Single-pr ... int_format
Men måste du använda flyttal?
I Modbus-sammanhang är det annars vanligt med heltal och en skalfaktor på 10 eller 100 för t.ex. temperaturer.
https://en.wikipedia.org/wiki/Single-pr ... int_format
Men måste du använda flyttal?
I Modbus-sammanhang är det annars vanligt med heltal och en skalfaktor på 10 eller 100 för t.ex. temperaturer.
Re: Konvertera flyttal till heltal (Integer) i C
Nä, jag ville inte, men leverantören av utrustningen använder det, så jag måste konvertera de data jag får, vilka då ligger som två 16-bitar värden i en struktur.
-
- Inlägg: 1397
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Konvertera flyttal till heltal (Integer) i C
Du får alltså en 32-bit int (delat på 2x 16 bit) som motsvarar en IEEE-float och du vill ha det som heltal?
Kod: Markera allt
uint16_t data[2] = { 0x0000, 0x42AE }; // little endian, du får byta plats på de två talen om din maskin har big endian.
int i = (int)(*(float*)data + 0.5f); // avrundar till närmsta heltal. ta bort +0.5f om du bara vill hugga av decimalerna.
Re: Konvertera flyttal till heltal (Integer) i C
Min gissning är att Tomas skulle vilja ha en rutin som inte länkar in ett float-lib.
Om man kollar Jans länk, och med lite vetskap inom vilka begränsningar som
värdena i just detta fall kan befinna sig, så går det nog att fixa en liten och
effektiv rutin utan float libar...
Om man kollar Jans länk, och med lite vetskap inom vilka begränsningar som
värdena i just detta fall kan befinna sig, så går det nog att fixa en liten och
effektiv rutin utan float libar...
-
- Inlägg: 1397
- Blev medlem: 29 januari 2011, 21:06:30
- Ort: Lapplandet
Re: Konvertera flyttal till heltal (Integer) i C
Inte speciellt ovanligt idag att mikrokontrollers har FPU. Om inte kompilatorn är helt dum blir det väldigt få instruktioner. Betydligt mindre kod, och körs snabbare, än att försöka konvertera manuellt.
Edit:
Utan avrundningen blir det blir 3 instruktioner på en ARM-A9 kompilerat med gcc.
Ladda data till register
konvertera till int
spara till i
Edit:
Utan avrundningen blir det blir 3 instruktioner på en ARM-A9 kompilerat med gcc.
Ladda data till register
konvertera till int
spara till i