n° 185
Maggio/Giugno 2013
Maggio 19, 2013, 04:43:49 pm *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  

* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: convertire float in sint32_t (quando e' possibile) senza passare dal casting  (Letto 1567 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
flameman
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 43


Mostra profilo E-mail
« inserita:: Marzo 14, 2012, 02:14:53 pm »

ciao
essendo

float       float_value;
sint32_t floor_part;

tralasciando per un attimo il fatto che il range coperto dai numeri float IEEE 754 binary floating point representation supera di gran lunga il range copriblile da sint32_t e che quindi dovrei anche valutare di volta in volta se la conversione e' possibile, oppure segnalare che non lo e'

ora vorrei evitare come la morte di dover fare questa porcheria:

floor_part = (sint32_t) float_value;

Dando una rapida occhiata all'assembler prodotto negli intorni di quella riga C noto che dietro a quel casting deve intervenire pesantemente il compilatore, cosa che non mi piace nemmeno un po', anche perche' non tutti i compilatori C che ho me lo fanno, alcuni non fanno raticamente nulla e mi copiano bit a bit quanto e' contenuto in termini di mantissa ed esponenziale nei 32bit della definizione float e io mi ritrovo in floor_part qualcosa di assolutamente sbagliato.

non posso (e non voglio) permettermi il casting di un float in un uint32_t (signed long 32bit), sicche' idee, alternative ?
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +204/-15
Scollegato Scollegato

Messaggi: 2705


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #1 inserita:: Marzo 15, 2012, 04:25:31 pm »

In breve, e senza entrare nel merito dell'effettiva necessarietà di usare dei numeri FP(1), si tratta di una delle numerose occasioni nelle quali il ricorso all'assembly inline è pressoché obbligatorio per garantire coerenza e consistenza del risultato.


(1) Nel mondo embedded, in 9999 casi su 10000 il FP serve a nulla e la virgola fissa va benissimo, anzi meglio.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
flameman
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 43


Mostra profilo E-mail
« Risposta #2 inserita:: Marzo 17, 2012, 01:41:43 pm »

Ho risolto in C, giocando con i bit del formato IEEE574
mi ha aiutato moltissimo questo piccolo tool che visualizza i bit segno, mantissa, esponente
http://www.h-schmidt.net/FloatApplet/IEEE754.html

Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +204/-15
Scollegato Scollegato

Messaggi: 2705


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #3 inserita:: Marzo 18, 2012, 04:11:12 am »

Mi sbaglio o avevi accennato a problemi di portabilità e generazione del codice da parte di diversi cross-compiler?

Premesso e ribadito nuovamente che usare FP in un sistema embedded è Male (eccetto ovviamente in casi limite come SHARC DSP, Magellan e compagnia cantante), repetita juvant, tutto ciò che un informatico quadratico medio dovrebbe sapere sul floating point (fino ai limiti di chi si accinge a scrivere una libreria matematica per un idoneo target) è ben sintetizzato qui.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
flameman
Newbie
*

Karma: +0/-0
Scollegato Scollegato

Messaggi: 43


Mostra profilo E-mail
« Risposta #4 inserita:: Marzo 18, 2012, 05:13:05 pm »

Maw il mio problema e' che alcuni compilatori interpretano correttamente il significato di casting quando lo si richiede per convertire un float in un sint32_t, mentre altri compilatori piu' sciocchi non lo fanno e ti copiano bit a bit un formato numerico nell'altro infischiandosene del significato che hanno i bit.

Se dipendesse da me farei uso di fixedpoint e buona notte come e' raccontato nel link che hai segnalato, sono piu' che daccordo, sopratutto dopo aver fatto analisi numerica in universita', dove ti fanno vedere quanti problemi saltano fuori usando il float, pero' nel mio caso:

1) sono un mero esegutore, ho una serie di requisiti che chiedono ieee574, cosi' vuole il cliente
2) ho richieste sia per cpu/dsp che sanno fare in hw ieee574
3) sia richieste per cpu/dsp softcore che di base non saprebbero fare ieee574 perche' non hanno FPU, ma che nel loro progetto sono stati dopati di steroidi e sintetizzati in fpga dando loro non solo piu' Mhz di quello che e' la versione ASIC, ma anche questa nuova possibilita' di macinare dati in floating point

e quindi il problema nasce da alcune richieste particolari del BSP per il quale il committente vuole anche una conversione float_to_sint32_t (si ora sono interessati anche al segno, prima il requisito parlava di unsigned long, uint32_t).

Per accontentarle tutti, anche i compilatori C sciocchi, ho risolto con del codice C che molto sinteticamente interpreta i vari bit all'interno del formato float e con essi ricostruisce la parte intera nel formato sint32_t

Nello specifico, facendo uso di una union {float, uint32_t}, estraggo il bit di segno, che utilizzo solo alla fine, e di li in poi considero il numero flaot come se fosse positivo, quindi estraggo i bit dell'esponente e li uso per ottenere una potenza di due in sint32_t, con un banale shift, poi aggiungo a questa base il significato che hanno i bit della mantisa a partire dal bit22 muovendomi verso destra (verso il bit0) di tante posizioni quante quelle specificate dal esponente.

Il risultato finale e' quello che volevo: la parte intera del numero float, perfettamente rappresentata in sint32_t, e nota che questa procedura lavora soltanto in sint32_t, e non necessita di alcun casting: ho potuto giustificare l'attivita' portendo utilizzare l'idea anche in ADA, linguaggio talmente tipizzato da non ammettere affatto alcun uso di backdoor come il casting sul C.



p.s.
hai messo il dito nella piaga, alcuni target sono lo squalo tigre, anche se devo dire che e' quello che "morde" di meno.
Registrato
M.A.W. 1968
** LEGGETE IL REGOLAMENTO ! **
Global Moderator
Hero Member
*****

Karma: +204/-15
Scollegato Scollegato

Messaggi: 2705


Discrete And Combinatorial Mathematics


Mostra profilo WWW
« Risposta #5 inserita:: Marzo 18, 2012, 07:16:40 pm »

p.s.
hai messo il dito nella piaga, alcuni target sono lo squalo tigre, anche se devo dire che e' quello che "morde" di meno.

Non avevo molti dubbi in proposito. Ghigno


PS: Ada è, da sempre, uno dei miei linguaggi preferiti, nonostante l'epidermica somiglianza col Pascal. Fare quella conversione esplicita in C è una buona soluzione, purché tu abbia verificato esattamente il risultato in Assembly sui vari target - ciò che d'altronde ritengo tu abbia già fatto.
Registrato

I Moderatori invitano tutti gli utenti a prendere visione del REGOLAMENTO e a rispettarlo.

Un blog? Io? Occhiolino
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2011 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



Links to Page