Kode di bawah ini berfungsi pada Visual Studio 2008 dengan dan tanpa pengoptimalan. Tetapi ini hanya berfungsi pada g ++ tanpa pengoptimalan (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;
}
Outputnya harus:
4.5
4.6
Tapi g ++ dengan pengoptimalan ( O1
- O3
) akan menghasilkan:
4.5
4.5
Jika saya menambahkan volatile
kata kunci sebelum t, itu berfungsi, jadi mungkinkah ada semacam bug pengoptimalan?
Uji pada g ++ 4.1.2, dan 4.4.4.
Berikut adalah hasil di ideone: http://ideone.com/Rz937
Dan opsi yang saya uji di g ++ sederhana:
g++ -O2 round.cpp
Makin menarik hasilnya, meski saya mengaktifkan /fp:fast
opsi Visual Studio 2008, hasilnya tetap benar.
Pertanyaan lebih lanjut:
Saya bertanya-tanya, haruskah saya selalu mengaktifkan -ffloat-store
opsi?
Karena versi g ++ yang saya uji dikirimkan dengan CentOS / Red Hat Linux 5 dan CentOS / Redhat 6 .
Saya mengumpulkan banyak program saya di bawah platform ini, dan saya khawatir itu akan menyebabkan bug yang tidak terduga di dalam program saya. Tampaknya agak sulit untuk menyelidiki semua kode C ++ saya dan pustaka yang digunakan apakah mereka memiliki masalah seperti itu. Ada saran?
Adakah yang tertarik mengapa bahkan /fp:fast
dihidupkan, Visual Studio 2008 masih berfungsi? Sepertinya Visual Studio 2008 lebih dapat diandalkan dalam masalah ini daripada g ++?