Konvertera flyttal till heltal (Integer) i C

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
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 »

TomasL skrev:22000000,0000
Du är med på att det här är nästan dubbelt så många värdesiffror som ryms i ett 32-bitars IEEE 754 flyttal?
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av hawkan »

Ja 7,5 värdesiffror är väl det man säger schablonmässigt.

Jag tänkte lite vidare hur man kan göra med decimaltal mellan 0-1
Om man kan tänka sej att jobba med heltal som är 1024 gånger större än decimaltalet så kan leka med exponentent i 2^n och uppskifta mantissan lämpligt.
För ett tal mellan 0-1 så är exponenten negativ kanske -3, så att mantissan som ligger mellan 1-2 multipliceras med 1/2^3 = 0.125
Man borde då kunna välja ut ett lämpligt antal bittar ur mantissan och jobba med antalet bittar 10 (från 1024 = 2^10) och exponenten n från talet.
Det här får vara en idé som nån kanske kan bygga vidare på. Nåt får ni göra själva :)
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45174
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av TomasL »

Jan Almqvist skrev:
TomasL skrev:22000000,0000
Du är med på att det här är nästan dubbelt så många värdesiffror som ryms i ett 32-bitars IEEE 754 flyttal?
Bara klippte från tillverkarens uppgifter.
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av hawkan »

Asch kunde inte hålla mej. Säj att heltalsområdet är 2^10 och talets exponent är n i 2^n (n negativt).
Ta då (10+n) bittar från mantissan och lägg till 1<<(10+n). Där är decimaltalet mellan 0-1 * 1024..
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45174
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av TomasL »

Frank har hållt på att leka lite, om man kör "standard" dvs castar från float till int, så kostar det minst 2kb programminne.
Franks rutin, (vet inte om han justerat för senare förslag mm) verkar plocka 200 byte programminne, så det är mycket vettigt att skriva egna rutiner för detta.

Verkar som att GCC länkar in en jäkla massa saker, vare sig de behövs eller inte, och eftersom vi kör i princip o-optimerat (O1), så plockar inte GCC bort redundant kod.
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av guckrum »

Kollat i glibc?
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av lillahuset »

Jag gissar att du inte har så ruggigt bråttom när du konverterar ett flyttal från Modbus. Eller?
Hur snabb är processorn? Skriva konverteringen i assembler?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45174
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av TomasL »

120 dMIPS, ungefär.
PIC32MX@80MHz.

Mer bekymrad över kodstorleken, som måste hållas nere.

Den rutinen vi har nu, dvs ungefär samma som publicerats tidigare i tråden, tar runt 200 byte, dock funkar den som sagt inte med tal som är mindre än 1 i nuläget, men det får jag lida med, så länge, har nog bara något enstaka, ej viktigt, register som kan anta värden under 1.
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av guckrum »

Funktionen för att konvertera från float till int med avrundning i glibc heter lrintf():

Kod: Markera allt

man 3 lrintf
Det är inte många rader kod, den är sannolikt korrekt och hanterar specialfallen.
Man kan ladda ner rubbet såhär

Kod: Markera allt

git clone git://sourceware.org/git/glibc.git
less glibc/sysdeps/ieee754/flt-32/s_lrintf.c
I klumpen finns även assemblerversioner för lite olika processorer samt testprogram. Läs licensinformationen.
Användarvisningsbild
jesse
Inlägg: 9233
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av jesse »

problemet med lrintf() är väl att det inte går att välja inom vilket intervall man vill skapa heltal ifrån.

Om du har ett float som går från 0 - 100000 så går det ju utmärkt, men om du ska omvandla 0.00000 till 0.9999999 till ett heltal mellan 0 och 65535 så funkar det antagligen inte? Baronens kod gör ju jobbet med de små justeringar jag föreslog , dessutom med ett argument med vilken 2-potens man vill shifta talet med innan omvandling.

... det går visserligen att justera exponenten i förväg så att du får lämplig storlek på det tal som ska omvandlas.
guckrum
Inlägg: 1671
Blev medlem: 19 juni 2012, 09:04:27
Ort: Lund

Re: Konvertera flyttal till heltal (Integer) i C

Inlägg av guckrum »

problemet med lrintf() är väl att det inte går att välja inom vilket intervall man vill skapa heltal ifrån.
Det är korrekt, i sådana fall får man skala insignalen innan, tex genom att modifiera exponenten.
Skriv svar