Il codice seguente funziona su Visual Studio 2008 con e senza ottimizzazione. Ma funziona solo su g ++ senza ottimizzazione (O0).
#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 ottimizzazione ( O1
- O3
) produrrà:
4.5
4.5
Se aggiungo la volatile
parola chiave prima di t, funziona, quindi potrebbe esserci una sorta di bug di ottimizzazione?
Test su g ++ 4.1.2 e 4.4.4.
Ecco il risultato su ideone: http://ideone.com/Rz937
E l'opzione che provo su g ++ è semplice:
g++ -O2 round.cpp
Il risultato più interessante, anche se accendo l' /fp:fast
opzione su Visual Studio 2008, il risultato è comunque corretto.
Ulteriore domanda:
Mi chiedevo, devo sempre attivare l' -ffloat-store
opzione?
Perché la versione g ++ che ho testato viene fornita con CentOS / Red Hat Linux 5 e CentOS / Redhat 6 .
Ho compilato molti dei miei programmi su queste piattaforme e sono preoccupato che possa causare bug imprevisti all'interno dei miei programmi. Sembra un po 'difficile indagare su tutto il mio codice C ++ e sulle librerie utilizzate se hanno tali problemi. Qualche suggerimento?
Qualcuno è interessato al motivo per cui anche se /fp:fast
acceso, Visual Studio 2008 funziona ancora? Sembra che Visual Studio 2008 sia più affidabile su questo problema di g ++?