Konvertera flyttal till heltal (Integer) i C

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Konvertera flyttal till heltal (Integer) i C

Inlägg av TomasL »

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.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av Micke_s »

Enklast i c är:

Kod: Markera allt

float input = 87.15
int output = (int)input.
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
Användarvisningsbild
ffredrik
Inlägg: 340
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av ffredrik »

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.
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av Jan Almqvist »

Jag hade nog provat memcpy().

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.
Användarvisningsbild
ffredrik
Inlägg: 340
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av ffredrik »

Man kan prova memcpy(), men fungerar här gör det inte.
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av Jan Almqvist »

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.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43152
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av sodjan »

Kodexempel?
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av Jan Almqvist »

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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av TomasL »

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.
Användarvisningsbild
ffredrik
Inlägg: 340
Blev medlem: 20 oktober 2009, 17:52:18
Ort: Göinge

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av ffredrik »

Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av Jan Almqvist »

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.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45176
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av TomasL »

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.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av Mr Andersson »

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.
Användarvisningsbild
sodjan
EF Sponsor
Inlägg: 43152
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping
Kontakt:

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av sodjan »

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...
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av Mr Andersson »

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
Skriv svar