Sida 3 av 3

Re: Konvertera flyttal till heltal (Integer) i C

Postat: 25 januari 2018, 12:22:20
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?

Re: Konvertera flyttal till heltal (Integer) i C

Postat: 25 januari 2018, 12:48:14
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 :)

Re: Konvertera flyttal till heltal (Integer) i C

Postat: 25 januari 2018, 12:58:50
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.

Re: Konvertera flyttal till heltal (Integer) i C

Postat: 25 januari 2018, 13:26:19
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..

Re: Konvertera flyttal till heltal (Integer) i C

Postat: 25 januari 2018, 15:27:20
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.

Re: Konvertera flyttal till heltal (Integer) i C

Postat: 25 januari 2018, 16:58:13
av guckrum
Kollat i glibc?

Re: Konvertera flyttal till heltal (Integer) i C

Postat: 25 januari 2018, 19:08:48
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?

Re: Konvertera flyttal till heltal (Integer) i C

Postat: 25 januari 2018, 20:09:53
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.

Re: Konvertera flyttal till heltal (Integer) i C

Postat: 25 januari 2018, 20:37:25
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.

Re: Konvertera flyttal till heltal (Integer) i C

Postat: 26 januari 2018, 10:16:53
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.

Re: Konvertera flyttal till heltal (Integer) i C

Postat: 26 januari 2018, 10:27:09
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.