Newsgroup: it.comp.lang.c
Titolo: virgola mobile e  fissa

Devo risolvere un sistema lineare con il C, per una applicazione audio real
time da implementare
 su un DSP.
 Uso il metodo di eliminazione di Gauss. Ora però i coefficienti
 della matrice che fungono da pivot (che non posso scambiare di ordine per
dei motivi che non
 sto a dire), possono valere anche 10^-2, 10?^-6, o 10^+9
 (cioè possono essere sia piccolissimi che grandissimi).
Ora io vi chiedo: esiste la maniera per indicare al C che debba svolgere i
calcoli del
 procedimento di eliminazione di Gauss, in virgola mobile, e non fissa,
altrimenti i
risultati che mi fornisce possono venire affetti da grandi errori?


Non sapevo nemmeno ci fossero tipi predefiniti per i calcoli in virgola 
fissa! Quali sono? O li simuli con gli interi? Ma il DSP e' in grado di fare 
i calcoli in virgola mobile?
Pleg 

 ha scritto nel messaggio 
news:DBF0j.179042$U01.1...@twister1.libero.it...

usa i tipi double (64bit) o i float (32bit) ;-)
brix 

 (cioè possono essere sia piccolissimi che grandissimi).
E' piu' una cosa da it.scienza.matematica, ma pazienza: ma questa matrice 
varia nel tempo? Realizza un filtro tempo-variante? Perche' se no non puoi 
decomporla offline in modo preciso e sfruttare computazioni piu' semplici 
online? Perche' non puoi scambiare l'ordine degli elementi pivotali?
Se ricordo bene sono gli elementi piccoli che ti fregano (che ti danno 
instabilita'). Potresti pensare, con la potenza di calcolo che hai a 
disposizione, di adottare un qualche approccio ai valori singolari per 
alleviare i problemi di stabilita'?
Pleg 

 usa i tipi double (64bit) o i float (32bit) ;-)
Attenzione ad associare una dimensione in bit prestabilita ai tipi del C.
Lo standard non ne prescrive nessuna a priori e tutto dipende dal formato
specifico sul quale i tipi si basano.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 specifico sul quale i tipi si basano.
oltretutto il codice va a finire su un DSP, facile che sia a 16 bit.
Ciao Jack

 risultati che mi fornisce possono venire affetti da grandi errori?
No, non è possibile.
O usi una libreria apposita per il calcolo a virgola fissa, o cambi 
algoritmo.
Manlio Perillo

 alleviare i problemi di stabilita'?
cioč?
adriano meis

Jack ha scritto:

Sarebbe vero in senso generale, in realtà i pacchetti float e double 
usano lo standard ANSI
predefinito: initile inventarsi l' acqua calda.
I float sono 32bit anche su CPU a 8bit, sin dai tempi dei compilatori 
Intel per 8031,
 e i double sono
1) 64bit  come da standard
2) o alias di float se la specifica  implementazione delle librerie  
matematiche non lo supporta.
Se usi un DSP, magari texas, i fp sono standard e se non vado errato, 
con il code-composer
c'e' anche un pacchetto di matematica a virgola fissa molto buono.
bye
brix

 Intel per 8031,
Irrilevanti. I float non sono a 32 bit, i float sono a 32 bit sulla
piattaforma X, Y e Z. Non si può prescindere dalle piattaforme quando si
parla di lunghezze in bit.


 parla di lunghezze in bit.
Oltretutto bisogna vedere se il DSP ce l'ha l'unita' a virgola mobile
nella ALU, perche' altrimenti tu ti scrivi il tuo bell'algoritmo mega
ottimizzato in C, poi il compilatore trasforma tutti i tuoi bei
calcoli in virgola mobile in roba a virgola fissa (o tra interi),
utilizzando delle routine lente, perche' il processore non sa manco
cos'e' la fp.
Ciao Jack

   
Non c' entra una fafa capona che *abbia* o no l' unita' FPU in quanto
in questo caso viene usato un pacchetto FPU software.
Brix

 io temo anche quelli grandi. Sbaglio?
Non mi ricordo bene :-)
Pleg 

 Brix
--
Giorgio Silvestri
DSP/Embedded/Real Time OS   Software Engineer

 Quindi esiste almeno una implementazione non IEEE  :-)
Perche' e' piu' efficiente? Puoi indicarmi della documentazione? Sono 
curioso di vedere com'e' strutturato...
Pleg 


legenda:
il punto sta per la separazione fra la parte intera ela parte frazionaria
la virgola separa gli elementi nella stessa riga
il punto e virgola separa gli elementi in righe diverse:
in ordine la matrice č:
1^ riga= [1, 0.056, 10000+ me1, 400], ;
2^ riga=[-1, +1, 1200, 500+ mc2; ];
3^ riga=[0.098, 0.45+0.067*me1, 4300, 68000  ];
4^ riga=[0.087 +mc1, 200, 5900, 89000 ]
il vettore colonna invece č:[7800+qe2; 67000+qc2; 34000+qe1; 21000+qc1]
i coefficienti mc1, mc2 ecc variano da 0.01 a 10000 e dipendono
dall'intervallo di linearizzazione.
essi non sono fissi.
a rigore non sono fissi neanche gli altri valori numerici che ti ho dato,
perchč essi dipendono dai settaggi esterni. essi sono valiědi per la
configurazione di default dei settaggi,
adriano meis

 Pleg



Ho ancora il code-composer installata da qualche parte, magari faccio 
qualche test
per verificare se è cosi' optimizzato....con i DSP ho sempre trovato meglio 
usare
la virgola fissa....
bye
brix


--


 essi non sono fissi.
Ok, capito. Domanda stupida (non ho mai progettato un distorsore :-) : quate 
strutture come vengono applicate ai dati in ingresso? Cioe', chiamiamo x il 
vettore di dati in ingresso (suono campionato) e y il vettore d'uscita 
(suono post-processazione); sia anche A la matrice e B il vettore che mi hai 
dato. y = ?
O quei qe, qc sono l'ingresso x?
Pleg 

> essi non sono fissi.
Non puoi moltiplicare per 1000 e lavorare con gli interi o  usare il 
pacchetto a firgola fissa con
un altro fattore moltiplicativo, ad esempio 10?
1^ riga= [1000 , 56, 10000+( me1*1000), 400000], ;
2^ riga=[-1000, +1000, 1200000, 500000+( mc2*1000); ];
3^ riga=[98, 450+67*(me1*1000), 4300000, 68000000  ];
4^ riga=[87 +(mc1*1000), 200000, 5900000, 89000000 ]
colonna:
[7800000+(qe2*1000); 67000000+(qc2*1000); 34000000+(qe1*1000); 
21000000+(qc1*1000)]
se i coefficienti sono troppo elevati, puoi usare fattori moltiplicativi 
piu' bassi o
utilizzare tipi a 64bit, se puoi
brix


NO,
essi sono solo la linearizzazione a tratti del comportamento non lineare.
Grazie per l'interessamento di tutti finora manifestato,
adriano meis

Mi spiace, ma proprio non riesco a capire che cosa devi calcolare. Mi sforzo 
ma non vedo che cosa ci devi fare con quella matrice e quel vettore. 
Processi dati in streaming? Processi un campione alla volta? Se ti va di 
farmi un esempio esplicito si puo' vedere di trovare un modo furbo di fare i 
calcoli (se c'e'), se no vale quanto ti hanno detto finora (le 
considerazioni sulla virgola fissa e mobile).
Pleg 

   
Toh! mi è giusto capitato di lavorare oggi sul Texas TMS320C27XX con
CodeComposer Studio V3.1:
per togliermi la curiosità, mi sono compilato una bella tabellina di float,
che risultano essere tutti in formato standard 32bit IEEE :-)
float 1.0 =  0x3F800000     --> Standard 32bit IEEE
        2.5 = 0x40200000     ---> idem
        1.2345= 0x3F9E0419---> idem
Etc....
I double invece sono semplici alias dei float
Quindi texas non usa, almeno per i float nessun formato proprietario.
Forse la gestione floating point e' ottimizzata, ma il formato e' 
assolutamente
satandard.
Brix
 

"brix99luftballons" <brix99lu...@hotmail.invalid> ha scritto nel
messaggio news:Uig3j.9601$r62....@tornado.fastwebnet.it...

Perchè continui a fare questo genere di obiezioni ?
Non capisco!
Ho detto, più volte, che il formato NON IEEE è quello del C3x non di altri!
Con C3x si intende la famiglia di processori C30, C31, C32, C33 e forse
qualcun altro che non conosco.
Non certo C67x o C627xx o altro ancora.


 solo  alla polemica sterile.
Tu sei libero di blaterare quanto vuoi circa le presunte cazzate degli
altri; peccato che l'unico a dire minchiate sia tu. Le polemiche sterili
sono quelle che nascono con la gente come te, che continua a insistere su
certi punti, senza fare il minimo sforzo per capire quanto gli altri
stanno (giustamente, altro che cazzate) dicendo e senza conoscere la
terminologia corretta. Io non sto parlando dell'"industry standard" su cui
continui ad arroccarti stupidamente. Foss'anche che tutte le
implementazioni oggi presenti utilizzassero uno standard determinato (e ti
è già stato dimostrato che così non è), rimane valido il discorso di base.
Per "standard", nel gergo utilizzato qui dentro, si intende l'accezione
più ovvia: lo standard ISO. La dimensione dei tipi fondamentali *NON* è
fissata, il che lascia libero qualsiasi implementatore di usare quella che
più lo aggrada; l'implementazione *NON* è fissata, quindi qualsiasi
implementatore può attuare quella che vuole. Punto. Partire dal
presupposto che un tipo float/double abbia una certa dimensione e sia
sempre così perché esistono standard implementativi comuni è un errore
grande quanto una casa. Tu continua a pensarla così e quello ad essere
veramente skillato in cazzate, prima o poi, sarai tu.


   
non obbietto nulla e' solo curiosita': visto che sto lavorando con quello
ho solo guardato cosa fa. Diciamo che mi sembra strano che se esiste
un formato piu' efficiente dello IEEE texa non lo abbia implementato su
tutta la sua linea di processori senza supporto fp in hardware, tutto qui.
nel caso sia davvero piu' veloce, potrebbe essere interessante riutilizzarlo
al posto dell' implementazione standard.
brix

"brix99luftballons" <brix99lu...@hotmail.invalid> ha scritto nel
messaggio news:65h3j.9706$r62....@tornado.fastwebnet.it...

Del resto la linea C3x è piuttosto vecchia e quindi
i discorsi di efficienza che potevano valere anni fa possono
anche non valere oggi.
Può anche darsi che il formato IEEE sia in realtà migliore
sui nuovi hw.
Oppure ancora è stata fatta una scelta imposta dal "commerciale" :-(
A noi non resta che programmare al meglio in modo portabile.
Per quanto possibile :-)


 veramente skillato in cazzate, prima o poi, sarai tu.
Anche se per l'ennesima volta mi prenderò dell'idiota.
ROTFL   Senti chi parla ;-)
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >


Concordo ;-)
In realta' il soggetto una qualche ragione l' avrebbe, se avvesse
risposto tenendo conto del senso generale della domanda (cosa che
in generale non e' educato):
ovvero come fare calcolo in virgola mobile?
in C, usando float e double, ovvio...
affrettatamente ho indicato un size...Poi nel mini-flame seguente si 
diatribava
sul formato dei float o meno...
diciamo che in senso generale, e' vero che l' implementazione puo' essere
diversa da quelle IEEE (e' stato fatto un esempio- non dall' individuo- 
indicando un
DSP Texas (vecchio)) ma dal punto di vista della questio, il risultato 
non cambia:
si usano i float o double.
Poi nello specifico, anche i famosi Texas *recenti* usano lo standard 
IEEE....
e dico, se persino gli ATMEL (AVR) e i PIC (che e' tutto dire! ) usano 
lo standard
IEEE non sara per caso che l' acqua calda l' hanno gia inventata???
brix

 Anche se per l'ennesima volta mi prenderò dell'idiota.
Hai indovinato. Non hai prove che gli altri sparino cazzate, ma ti limiti
a ribattere per il gusto di farlo. Non hai preparazione tecnica e
competenza e faresti meglio a stare zitto. Lo hai sempre dimostrato nei
fatti, venendo fuori dal tuo misero angolino per poi ritornarci
sonoramente bastonato. Finora chi spara cazzate, qui dentro, è un
gruppetto di persone formato almeno da due tizi: tu e il brix99. Vediamo
se cresce.


 si usano i float o double.
E' ovvio che si usano float o double, ma non è a questo che ti si è
ribattuto. Piuttosto al fatto che davi delle dimensioni specifiche, quando
lo standard non ne prescrive nessuna.
Non risponderò ulteriormente né a te né al tuo altrettanto ridicolo
amichetto.


 
Devo rispolverare i vecchi post con tutte le cazzate che scrivevi tu?
Se inizi anche offendere ricorda che anche il mio vocabolario è ben 
fornito ;-)
