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?TomasL skrev:22000000,0000
Konvertera flyttal till heltal (Integer) i C
- Jan Almqvist
- Inlägg: 1581
- Blev medlem: 1 oktober 2013, 20:48:26
- Ort: Orust
Re: Konvertera flyttal till heltal (Integer) i C
Re: Konvertera flyttal till heltal (Integer) i C
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
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
Re: Konvertera flyttal till heltal (Integer) i C
Bara klippte från tillverkarens uppgifter.Jan Almqvist skrev: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?TomasL skrev:22000000,0000
Re: Konvertera flyttal till heltal (Integer) i C
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..
Ta då (10+n) bittar från mantissan och lägg till 1<<(10+n). Där är decimaltalet mellan 0-1 * 1024..
Re: Konvertera flyttal till heltal (Integer) i C
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.
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.
- 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
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?
Hur snabb är processorn? Skriva konverteringen i assembler?
Re: Konvertera flyttal till heltal (Integer) i C
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.
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.
Re: Konvertera flyttal till heltal (Integer) i C
Funktionen för att konvertera från float till int med avrundning i glibc heter lrintf():
Det är inte många rader kod, den är sannolikt korrekt och hanterar specialfallen.
Man kan ladda ner rubbet såhär
I klumpen finns även assemblerversioner för lite olika processorer samt testprogram. Läs licensinformationen.
Kod: Markera allt
man 3 lrintf
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
Re: Konvertera flyttal till heltal (Integer) i C
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.
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.
Re: Konvertera flyttal till heltal (Integer) i C
Det är korrekt, i sådana fall får man skala insignalen innan, tex genom att modifiera exponenten.problemet med lrintf() är väl att det inte går att välja inom vilket intervall man vill skapa heltal ifrån.