O código a seguir funciona no Visual Studio 2008 com e sem otimização. Mas só funciona no g ++ sem otimização (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;
}
A saída deve ser:
4.5
4.6
Mas g ++ com otimização ( O1
- O3
) produzirá:
4.5
4.5
Se eu adicionar a volatile
palavra - chave antes de t, funciona, então pode haver algum tipo de bug de otimização?
Teste em g ++ 4.1.2 e 4.4.4.
Aqui está o resultado em ideone: http://ideone.com/Rz937
E a opção que testo no g ++ é simples:
g++ -O2 round.cpp
O resultado mais interessante, mesmo eu habilitando a /fp:fast
opção no Visual Studio 2008, o resultado ainda está correto.
Mais perguntas:
Eu estava me perguntando, devo sempre ativar essa -ffloat-store
opção?
Porque a versão g ++ que testei é fornecida com CentOS / Red Hat Linux 5 e CentOS / Redhat 6 .
Compilei muitos de meus programas nessas plataformas e estou preocupado que isso cause bugs inesperados em meus programas. Parece um pouco difícil investigar todo o meu código C ++ e bibliotecas usadas se eles têm esses problemas. Alguma sugestão?
Alguém está interessado em saber /fp:fast
por que o Visual Studio 2008 ainda funciona? Parece que o Visual Studio 2008 é mais confiável nesse problema do que o g ++?