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...