Đoạn mã dưới đây hoạt động trên Visual Studio 2008 có và không có tối ưu hóa. Nhưng nó chỉ hoạt động trên g ++ mà không có tối ưu hóa (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;
}
Đầu ra phải là:
4.5
4.6
Nhưng g ++ với tối ưu hóa ( O1
- O3
) sẽ xuất ra:
4.5
4.5
Nếu tôi thêm volatile
từ khóa trước t, nó hoạt động, vì vậy có thể có một số loại lỗi tối ưu hóa?
Thử nghiệm trên g ++ 4.1.2 và 4.4.4.
Đây là kết quả trên Ideone: http://ideone.com/Rz937
Và tùy chọn tôi thử nghiệm trên g ++ rất đơn giản:
g++ -O2 round.cpp
Kết quả thú vị hơn, ngay cả khi tôi bật /fp:fast
tùy chọn trên Visual Studio 2008, kết quả vẫn chính xác.
Câu hỏi thêm:
Tôi đã tự hỏi, tôi có nên bật -ffloat-store
tùy chọn luôn không?
Vì phiên bản g ++ mà tôi đã thử nghiệm được vận chuyển cùng với CentOS / Red Hat Linux 5 và CentOS / Redhat 6 .
Tôi đã biên soạn nhiều chương trình của mình trên các nền tảng này và tôi lo rằng nó sẽ gây ra các lỗi không mong muốn bên trong các chương trình của tôi. Có vẻ hơi khó khăn để điều tra tất cả mã C ++ của tôi và các thư viện đã sử dụng xem chúng có gặp sự cố như vậy không. Bất kì lời đề nghị nào?
Có ai quan tâm đến việc tại sao ngay cả khi được /fp:fast
bật, Visual Studio 2008 vẫn hoạt động không? Có vẻ như Visual Studio 2008 đáng tin cậy hơn ở vấn đề này so với g ++?