Cercando di eseguire il porting del codice java su C++, mi sono imbattuto in qualche comportamento strano. Non riesco a ottenere una doppia aggiunta al lavoro (anche se l'opzione compiler/fp: strict che significa "corretta" matematica in virgola mobile è impostata in Visual Studio 2008).Perché i doppi vengono aggiunti in modo non corretto in un progetto specifico di Visual Studio 2008?
double a = 0.4;
/* a: 0.40000000000000002, correct */
double b = 0.0 + 0.4;
/* b: 0.40000000596046448, incorrect
(0 + 0.4 is the same). It's not even close to correct. */
double c = 0;
float f = 0.4f;
c += f;
/* c: 0.40000000596046448 too */
In un diverso progetto di test ho istituito funziona benissimo (/ fp: si comporta severe in base alle IEEE754).
Utilizzo di Visual Studio 2008 (standard) con Nessuna ottimizzazione e FP: strict.
Qualche idea? Sta davvero troncando ai galleggianti? Questo progetto ha davvero bisogno dello stesso comportamento su entrambi i lati Java e C++. Ho ottenuto tutti i valori leggendo dalla finestra di debug in VC++.
Soluzione: _fpreset(); // L'idea di Barry Kelly l'ha risolta. Una libreria stava impostando la precisione FP su un valore basso.
È possibile pubblicare un piccolo programma di test completo con la riga di comando esatta utilizzata per compilare (vedere la finestra di output, ecc.), Che dimostra il problema? L'unico modo che posso riprodurre è usando 0.0f + 0.4f invece. –
Possiamo presumere che tu sia a conoscenza dell'imprecisione dei tipi a virgola mobile? Essere precisi con 7 posizioni decimali è generalmente considerato ok poiché la precisione di stampa predefinita è 6. –
@Evan, il suo esempio è più alto di quello che sarebbe spiegato dall'imprecisione in virgola mobile. – Kevin