Newsgroup: it.discussioni.ingegneria
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?

 ha scritto nel messaggio 
news:MAF0j.179041$U01.1...@twister1.libero.it...

il tipo di variabile...


cioè, se io uso "float" allora di sicuro lui impiegherà la virgola mobile?
mentre con "integer" userà la virgola fissa?


wrote:

Con integer non puoi registrare valori frazionari, devi usare double
float.
-- 
Paolo "Spino"

 risultati che mi fornisce possono venire affetti da grandi errori?
Virgola o non virgola... il problema è che le cifre significative sono
limitate.
Se fai 10^40 + 10^10,  taglia qualcosa perchè non c'è un formato che
ha 30 cifre significative.
per il C
Format  ...Minimum Precision .... Minimum Exponent Size
Short 13 bits 5 bits
Single 24 bits 8 bits
Double 50 bits 8 bits
 Long 50 bits 8 bits

 risultati che mi fornisce possono venire affetti da grandi errori?
Immagino che tu lavori con numeri in doppia precisione.
I calcoli vengono tutti eseguiti in virgola mobile.
Non devi proprio dire niente al compilatore.
Dato che non conosco il caso specifico posso solo azzardare che rischi
di trovarti con una matrice mal condizionata.
Avere variazioni di scala cosi' grande tra i coefficienti delle varie
equazioni potrebbe anche essere deleterio. Alcuni termini potrebbero
perdersi perche' poco significativi.
Potresti comunque fare delle prove per vedere se i risultati del tuo
sistema sono corretti.
Esiste un metodo particolare per risolvere i sistemi di equazioni che si
basa sulla scomposizione in tre matrici della matrice dei coefficienti.
Una delle matrici e' diagonale e i suoi termini sono proporzionali ai
suoi autovalori.
E qui vedi subito se il sistema e' mal condizionato.
Non mi ricordo come si chiama ma se cerchi nei numerical recipes (li
trovi in rete con google) i metodi per risolvere i sistemi trovi anche
questo. E' li' gia' fatto, devi solo usarlo.
Pero' credo che sia troppo lento per il real time e quindi puoi usarlo
solo per confronto.
Se trovi soluzioni discordanti potresti anche provare a bilanciare il
tuo sistema di equazioni cercando di riportare i coefficienti in scale
di grandezze simili.
Attenzione che potrebbe anche non servire a niente (sempre per il
discorso sul numero delle cifre significative) ma puoi provarci.
In pratica non devi far altro che moltiplicare le equazioni per dei
numeri che ti portino ad avere lo stesso ordine di grandezza.
Basta semplicemente confrontare le equazioni poi decidi tu un criterio.
P.S.
Se il sistema e' mal condizionato non ci sono santi. Non commetterai
semplici errori ma tirerai fuori i numeri del lotto.
-- 
Ciao da Francesco B.

 grandi errori?
Il problema che ti poni non è semplicissimo da risolvere.
Se il dispositivo e/o il compilatore che usi supportano i
tipi float, dichiara in questo modo le variabili, i calcoli
saranno eseguiti in virgola mobile ed il problema si
risolve, a meno che l'implementazione dell'aritmetica
floating point non venga eseguita in software, il che
potrebbe rallentare moltissimo l'esecuzione e non
soddisfare le specifiche.
Se invece vuoi usare una rappresentazione frazionaria
con tipi interi (fixed point), allora devi affrontare un
problema grosso: se non scegli una rappresentazione
adeguata il problema può risultare mal condizionato e
dar luogo a matrici singolari, e quindi sistemi che non
possono essere risolti! E questo dipende non solo dalla
rappresentazione, ma anche dai dati. Quindi non esiste
una soluzione semplice, bisogna studiare molto bene
il problema e le caratteristiche dei dati.
A.D.


cari colleghi,
interessante. Diversi anni fa ho disegnato e costruito un robotino
s.c.a.r.a. azionato con
cilindri oleodinamici. Le proporzionali erano reatroazionate con il segnale
di 4 potenziometri
gestiti attraverso una scheda A/D della bluechip tech...anni ruggenti...
Avevo fatto anche il software per la gestione della cinematica, usando il C
per il basso livello del linguaggio, nel senso che dispone di funzioni per
scrivere sugli indirizzi di memoria. In questo modo si possono facilmente
acquisire tutti i segnali della scheda..ecc...il robotino ha funzionato, ha
fatto il suo lavoro, usando i tipi float.
Anni dopo, durante un master di sec. liv, un professore (matematico
numerico) mi ha spiegato i limiti del C, o meglio dei compilatori del C.
Infatti, secondo questo prof, i compilatori C allocano nella memoria di
massa i bit compilati in modo verticale, per colonne insomma. Invece il
Fortran, che è stato studiato appositamente per applicazioni numeriche,
viene gestito allineaneando i bit per righe. Ebbene, in questo modo, per
righe insomma, le informazioni contenute nel codice verrebbero meno
frazionate, in quanto ogni byte della memoria verrebbe occupato in modo
univoco, con meno spezzettamenti delle informazioni insomma. Per contro non
so se il Fortran, o le versioni recenti, hanno la possibilità di andare a
basso livello.
Resta il fatto che tutto poi dipende dalla bontà (e velocità in questo caso)
dell'algoritmo.
Comunque si potrebbe pre-condizionare la matrice con un metodo iterativo,
per poi risolvere con un metodo a k passi....ma real time? Provare con
rt-linux, ma comunque serve un certo tempo al processore per eseguire i
conti e per renderli disponibili in memoria.
Esistono dei metodi per risolvere i sistemi (anche non lineari) senza
passare per inversioni di matrici, che sono lente e pericolose dal punto di
vista numerico. Infatti, per la gestione della cinematica dei robot, si
passa attraverso la trasposta dello jacobiano del meccanismo. In questo modo
si evitano i problemi numerici. In pratica si basano sulla derivata di Lie,
imponendo l'asintotica stabilità del sistema. Questi metodi sono molto
veloci e numericamente affidabili. Adesso non saprei bene se questo possa
aiutarla nel suo intento, ma trova un spiegazione di questi metodi sullo
Sciavicco- Siciliano o anche sullo Tsai.
Cari Saluti
Bruno Zilli
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 basso livello.
Non capisco come l'allocazione su memoria di massa avvenga per colonnne 
piuttosto che per righe, sembra considerare uno spazio bidimensionale 
per la memoria di massa piuttosto che monodimensionale o tridimensionale 
( cylinder, head, track ).
Inoltre non capisco come l'allocazione su memoria di massa influenzi 
l'esecuzione. Dato che il caricamento da memoria di massa precede 
l'esecuzione basterebbe includere nel caricamento la "riorganizzazione" 
meglio i bit, ma rimane il fatto che non capisco in cosa consista questa 
organizzazione a righe o quale vantaggio possa portare.

,

Da quanto so io, la differenza tra Fortran e C sta nel modo in cui
vengono registrati in memoria ram gli array bidimensionali (matrici).
Ad esempio la matrice:
a b c
d e f
g h i
viene copiata dal C in locazioni successive di memoria in ordine per
righe:
a b c d e f g h i
mentre il fortran la organizza per colonne:
a d g b e h c f i
Al momento non ricordo se l'organizzazione "per colonne" abbia dei
motivi legati al calcolo matriciale o se sia una semplice convenzione.
Questo influenza comunque il modo in cui sono scritti gli algoritmi
del fortran (esistono operatori appositi per le operazioni su
matrice).
Infatti, lavorando "per colonne", si ottiene di ottimizzare le
operazioni su matrici di grandi dimensioni minimizzando il numero di
accessi alla memoria. Infatti, quando leggo dalla ram l'elemento "a"
della matrice, il sistema operativo copia in cache anche un certo
numero di locazioni consecutive. Quindi con un unico accesso leggo in
realtà una colonna intera della matrice. Per questo motivo, ad
esempio, fare la somma "a + d + g" in fortran è più rapido che fare la
somma "a + b + c". In C dovrebbe essere il contrario.

 ha scritto nel messaggio 
news:pMF0j.179058$U01.1...@twister1.libero.it...

per usare la virgola fissa usi un integer e poi devi interpretare i primi 
bit attraverso il tuo programma.
(dividendo opportunamente per avere i bit senza virgola e facendone il 
modulo per avere i bit
che rappresentano i numeri dopo la virgola)
float è una rappresentazione che utilizza la virgola mobile in modo 
automatico... non devi gestire nulla... 

 semplici errori ma tirerai fuori i numeri del lotto.
Avevo espresso il concetto in maniera più semplice: se ti trovi ad
avere bisogno di 30 cifre significative, non ne esci.


ciao Andrea, come stai?
Ci conosciamo.
Cosa fai? Dove sei adesso?
---
per le righe pro colonne C/Fortran, hai letto dopo?..era così...comunque
industrialmente ho visto usare il C, anche tu no? (sorrido..so che sei un
programmatore)
Ho visto cose in Fortran, anche eccellenti, ma non
nell'automazione/robotica.
Mandi
Bruno


 vengono registrati in memoria ram gli array bidimensionali (matrici).
Avevo preso "memoria di massa" alla lettera.

 Bruno
Ciao