Der folgende Code funktioniert in Visual Studio 2008 mit und ohne Optimierung. Es funktioniert aber nur unter g ++ ohne Optimierung (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;
}
Die Ausgabe sollte sein:
4.5
4.6
Aber g ++ mit Optimierung ( O1
- O3
) gibt aus:
4.5
4.5
Wenn ich das volatile
Schlüsselwort vor t hinzufüge , funktioniert es. Könnte es also einen Optimierungsfehler geben?
Test auf g ++ 4.1.2 und 4.4.4.
Hier ist das Ergebnis auf ideone: http://ideone.com/Rz937
Und die Option, die ich auf g ++ teste, ist einfach:
g++ -O2 round.cpp
Das interessantere Ergebnis, auch wenn ich die /fp:fast
Option in Visual Studio 2008 aktiviere, ist das Ergebnis immer noch korrekt.
Weitere Frage:
Ich habe mich gefragt, ob ich die -ffloat-store
Option immer aktivieren soll .
Da die von mir getestete g ++ - Version mit CentOS / Red Hat Linux 5 und CentOS / Redhat 6 geliefert wird .
Ich habe viele meiner Programme unter diesen Plattformen kompiliert und befürchte, dass dies zu unerwarteten Fehlern in meinen Programmen führen wird. Es scheint ein wenig schwierig zu sein, meinen gesamten C ++ - Code und die verwendeten Bibliotheken zu untersuchen, ob sie solche Probleme haben. Irgendein Vorschlag?
Interessiert sich jemand dafür, warum /fp:fast
Visual Studio 2008 überhaupt noch funktioniert? Es scheint, dass Visual Studio 2008 bei diesem Problem zuverlässiger ist als g ++?