View Single Post
Old 05-03-2009, 21:21   #1
TuLKaS85
Senior Member
 
L'Avatar di TuLKaS85
 
Iscritto dal: Nov 2004
Città: Napoli
Messaggi: 999
[C- vari] Enigma approssimazioni

Salve, sono alle prese con un problema da cui non riesco a venirne fuori.

Ci vorrebbe qualcuno esperto con il sistema floating point.
Uso diversi linguaggi tra cui C, Fortran e Matlab.
La questione è la seguente, ho una riga di codice che dipende da una sola variabile, questa variabile è IDENTICA in tutti e tre gli ambienti sopra citati.
L'output purtroppo anche se di pochissimo, è diverso.

Per apprezzare queste differenze sono andato ad osservare le rappresentazioni esadecimali di queste variabili double.

il codice che segue è il medesimo tra tutti gli ambienti (fidatevi), le prime due righe sono quelle originali, le altre sono delle derivazioni, che dovrebbero produrre lo stesso risultato, almeno a livello matematico.

Osservate e giudicate:
(absc1 e absc2 sono dei valori double impostati che ovviamente non cambiano tra i vari casi sotto elencati )
Codice:
// 1
tabsc1 = (1-absc1)/absc1;
tabsc2 = (1-absc2)/absc2;
// 2
tabsc1 = (0.5/absc1-1+0.5/absc1);
tabsc2 = (0.5/absc2-1+0.5/absc2);
// 3
tabsc1 = (1.0/absc1-1.0);
tabsc2 = (1.0/absc2-1.0);
// 4
tabsc1 = ((0.5-absc1)/absc1+0.5/absc1);
tabsc2 = ((0.5-absc2)/absc2+0.5/absc2);
valori in esadecimale di
absc1
3FE0117FD8ACBD94
absc2
3FDBDD4FCDF1D0EB

Risultati di tabsc1 e tabsc2
Codice:
Compilatore C:  gcc (Codeblock)

tabsc1                       tabsc2

3FEFBA4CD894D781    3FF4BFD02B02FEDB

3FEFBA4CD894D781    3FF4BFD02B02FEDB

3FEFBA4CD894D781    3FF4BFD02B02FEDB

3FEFBA4CD894D781    3FF4BFD02B02FEDB

Compilatore Intel Visual Fortran :

3FEFBA4CD894D781    3FF4BFD02B02FEDA

3FEFBA4CD894D782    3FF4BFD02B02FEDA

3FEFBA4CD894D782    3FF4BFD02B02FEDA

3FEFBA4CD894D782    3FF4BFD02B02FEDA

Matlab :

3FEFBA4CD894D781    3FF4BFD02B02FEDA

3FEFBA4CD894D782    3FF4BFD02B02FEDA

3FEFBA4CD894D782    3FF4BFD02B02FEDA

3FEFBA4CD894D782    3FF4BFD02B02FEDA
le differenze riguardano gli ultimi 4 bit della mantissa, anzi gli ultimi due.
Quali sono i valori esatti ?? quelli di C ? o quelli degli altri 2 ambienti ?
Da notare che con il primo valore di absc1 cambiando le formule si riescono ad ottenere due risultati differenti anche in Matlab e Fortran...
__________________
Intel Pentium IV 3,0 GHz, Asus P5SD2-X , 1.0 Gb ddr2, Radeon X550 , Maxtor 160Gb sata, Hitachi 100 gb pata,Piooner Dvr-109 ,Microsoft Windows XP Professional Service Pack 2
TuLKaS85 è offline   Rispondi citando il messaggio o parte di esso