नीचे दिया गया कोड विजुअल स्टूडियो 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
लेकिन अनुकूलन ( O1
- O3
) आउटपुट के साथ g ++ :
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
विज़ुअल स्टूडियो 2008 पर विकल्प चालू करता हूं, फिर भी परिणाम सही है।
अगला सवाल:
मैं सोच रहा था, क्या मुझे हमेशा -ffloat-store
विकल्प चालू करना चाहिए ?
क्योंकि मेरे द्वारा परीक्षण किया गया g ++ संस्करण CentOS / Red Hat Linux 5 और CentOS / Redhat 6 के साथ भेज दिया गया है ।
मैंने इन प्लेटफार्मों के तहत अपने कई कार्यक्रमों को संकलित किया है, और मुझे चिंता है कि यह मेरे कार्यक्रमों के अंदर अप्रत्याशित कीड़े पैदा करेगा। मेरे सभी C ++ कोड और उपयोग किए गए पुस्तकालयों की जांच करना थोड़ा मुश्किल लगता है कि क्या उन्हें ऐसी समस्याएं हैं। कोई उपाय?
क्या किसी की भी दिलचस्पी क्यों /fp:fast
चालू है, विजुअल स्टूडियो 2008 अभी भी काम करता है? ऐसा लगता है कि दृश्य स्टूडियो 2008 जी ++ की तुलना में इस समस्या पर अधिक विश्वसनीय है?