Aşağıdaki kod, Visual Studio 2008 üzerinde optimizasyonlu ve optimizasyonsuz çalışır. Ancak, optimizasyon olmadan yalnızca g ++ üzerinde çalışır (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;
}
Çıktı şöyle olmalıdır:
4.5
4.6
Ancak optimizasyonlu g ++ ( O1
- O3
) şu çıktıyı verir:
4.5
4.5
Ben eklerseniz volatile
t önce anahtar kelime, çalışır, bu yüzden optimizasyon böcek bir tür olabilir?
G ++ 4.1.2 ve 4.4.4'te test edin.
İdeone üzerindeki sonuç: http://ideone.com/Rz937
Ve g ++ üzerinde test ettiğim seçenek basit:
g++ -O2 round.cpp
Daha ilginç sonuç, /fp:fast
Visual Studio 2008'de seçeneği açsam bile , sonuç yine de doğrudur.
İlave soru:
Merak ediyordum, -ffloat-store
seçeneği her zaman açmalı mıyım?
Ben test gr ++ sürüm Çünkü sevk CentOs / Red Hat Linux 6 Redhat 5 ve CentOS / .
Programlarımın çoğunu bu platformlar altında derledim ve programlarımın içinde beklenmedik hatalara neden olacağından endişeliyim. Tüm C ++ kodumu araştırmak ve bu tür sorunları olup olmadığına dair kütüphaneleri kullanmak biraz zor görünüyor. Herhangi bir öneri?
/fp:fast
Visual Studio 2008'in neden açılmış olsa bile hala çalıştığını merak eden var mı? Görünüşe göre Visual Studio 2008 bu problemde g ++ 'dan daha güvenilir mi?