Le code ci-dessous fonctionne sur Visual Studio 2008 avec et sans optimisation. Mais cela ne fonctionne que sur g ++ sans optimisation (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;
}
La sortie doit être:
4.5
4.6
Mais g ++ avec optimisation ( O1
- O3
) affichera:
4.5
4.5
Si j'ajoute le volatile
mot - clé avant t, cela fonctionne, alors pourrait-il y avoir une sorte de bogue d'optimisation?
Test sur g ++ 4.1.2 et 4.4.4.
Voici le résultat sur ideone: http://ideone.com/Rz937
Et l'option que je teste sur g ++ est simple:
g++ -O2 round.cpp
Le résultat le plus intéressant, même si j'active l' /fp:fast
option sur Visual Studio 2008, le résultat est toujours correct.
Autre question:
Je me demandais, devrais-je toujours activer l' -ffloat-store
option?
Parce que la version g ++ que j'ai testée est livrée avec CentOS / Red Hat Linux 5 et CentOS / Redhat 6 .
J'ai compilé beaucoup de mes programmes sous ces plates-formes et je crains que cela ne cause des bogues inattendus dans mes programmes. Il semble un peu difficile d'étudier tout mon code C ++ et les bibliothèques utilisées s'ils ont de tels problèmes. Toute suggestion?
Quelqu'un est-il intéressé par pourquoi même /fp:fast
activé, Visual Studio 2008 fonctionne toujours? Il semble que Visual Studio 2008 est plus fiable à ce problème que g ++?