Il codice seguente funziona su Visual Studio 2008 con e senza ottimizzazione. Ma funziona solo su g ++ senza ottimizzazione (O0).Risultato in virgola mobile diverso con ottimizzazione abilitata - bug del compilatore?
#include <cstdlib>
#include <iostream>
#include <cmath>
double round(double v, double digit)
{
double pow = std::pow(10.0, digit);
double t = v * pow;
//std::cout << "t:" << t << std::endl;
double r = std::floor(t + 0.5);
//std::cout << "r:" << r << std::endl;
return r/pow;
}
int main(int argc, char *argv[])
{
std::cout << round(4.45, 1) << std::endl;
std::cout << round(4.55, 1) << std::endl;
}
L'output dovrebbe essere:
4.5
4.6
Ma g ++ con l'ottimizzazione (O1
-O3
) sarà in uscita:
4.5
4.5
Se aggiungo la parola volatile
prima di t, funziona, quindi potrebbe esserci qualche tipo di bug di ottimizzazione?
Test su g ++ 4.1.2 e 4.4.4.
Ecco il risultato sul Ideone: http://ideone.com/Rz937
E l'opzione I test sul g ++ è semplice:
g++ -O2 round.cpp
Il risultato più interessante, anche io attivare /fp:fast
opzione su Visual Studio 2008, il risultato è ancora corretto.
Ulteriore domanda:
Mi chiedevo, occorre rivolgersi sempre l'opzione -ffloat-store
?
Poiché la versione g ++ che ho provato è fornito con CentOS/Red Hat Linux 5 e CentOS/RedHat 6.
Ho compilato molti dei miei programmi sotto queste piattaforme, e sono preoccupato che causerà bug inaspettati all'interno dei miei programmi. Sembra un po 'difficile esaminare tutto il mio codice C++ e le librerie usate se hanno problemi simili. Qualche suggerimento?
C'è qualcuno interessato al motivo per cui anche /fp:fast
è attivato, Visual Studio 2008 funziona ancora? Sembra che Visual Studio 2008 sia più affidabile a questo problema di g ++?
A tutti i nuovi utenti SO: QUESTO è il modo in cui si fa una domanda. +1 – tenfour
FWIW, sto ottenendo l'output corretto con g ++ 4.5.0 usando MinGW. –
Ottengo 4,5 4,6 per tutti i casi. Qual è la tua versione g ++? Ho g ++ (Debian 4.3.2-1.1) 4.3.2 –