아래 코드는 최적화 여부에 관계없이 Visual Studio 2008에서 작동합니다. 그러나 최적화 (O0)없이 g ++에서만 작동합니다.
#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;
}
출력은 다음과 같아야합니다.
4.5
4.6
그러나 최적화 된 g ++ ( O1
- O3
)는 다음을 출력합니다.
4.5
4.5
volatile
t 앞에 키워드를 추가하면 작동하므로 최적화 버그가있을 수 있습니까?
g ++ 4.1.2 및 4.4.4에서 테스트합니다.
ideone의 결과는 다음과 같습니다. http://ideone.com/Rz937
그리고 g ++에서 테스트하는 옵션은 간단합니다.
g++ -O2 round.cpp
더 흥미로운 결과 /fp:fast
는 Visual Studio 2008 에서 옵션을 설정 하더라도 결과는 여전히 정확합니다.
추가 질문 :
항상 -ffloat-store
옵션을 켜야 하나요?
테스트 한 g ++ 버전 이 CentOS / Red Hat Linux 5 및 CentOS / Redhat 6과 함께 제공 되기 때문 입니다.
이 플랫폼에서 많은 프로그램을 컴파일했는데 프로그램 내부에 예기치 않은 버그가 발생 할까봐 걱정됩니다. 내 모든 C ++ 코드를 조사하고 그러한 문제가 있는지 라이브러리를 사용하는 것은 조금 어려울 것 같습니다. 어떠한 제안?
/fp:fast
Visual Studio 2008이 켜져 있는 이유에 관심이있는 사람 이 있습니까? Visual Studio 2008이 g ++보다이 문제에서 더 신뢰할 수있는 것 같습니다.