नीचे दिया गया कोड विजुअल स्टूडियो 2008 पर और बिना अनुकूलन के काम करता है। लेकिन यह केवल अनुकूलन (ओ 0) के बिना जी ++ पर काम करता है।ऑप्टिमाइज़ेशन सक्षम के साथ विभिन्न फ़्लोटिंग पॉइंट परिणाम - कंपाइलर बग?
#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
) के साथ ++ होगा उत्पादन:
4.5
4.5
अगर मैं टी से पहले volatile
कीवर्ड जोड़ने, यह काम करता है, तो क्या किसी प्रकार का अनुकूलन बग हो सकता है? जी पर
टेस्ट ++ 4.1.2, और 4.4.4।
यहाँ ideone पर परिणाम है: http://ideone.com/Rz937
और विकल्प मैं जी पर परीक्षण ++ सरल है:
g++ -O2 round.cpp
अधिक दिलचस्प परिणाम, यहां तक कि मैं विजुअल स्टूडियो 2008 पर /fp:fast
विकल्प को चालू, परिणाम अभी भी सही है।
इसके अलावा प्रश्न:
मैं सोच रहा था, मैं हमेशा -ffloat-store
विकल्प को चालू करना चाहिए?
क्योंकि जी ++ संस्करण मैं परीक्षण किया CentOS/Red Hat Linux 5 और CentOS/redhat 6 के साथ भेज दिया है।
मैं इन प्लेटफार्मों के तहत मेरे कार्यक्रमों में से कई संकलित, और मैं चिंतित यह मेरे कार्यक्रमों के अंदर अप्रत्याशित बग का कारण होगा हूँ। मेरे सभी सी ++ कोड की जांच करना और पुस्तकालयों का उपयोग करना थोड़ा मुश्किल लगता है कि उन्हें ऐसी समस्याएं हैं या नहीं। कोई उपाय? क्यों भी /fp:fast
चालू है, विजुअल स्टूडियो 2008 अभी भी काम करता है
किसी में रुचि है? ऐसा लगता है कि विजुअल स्टूडियो 2008 जी ++ की तुलना में इस समस्या पर अधिक विश्वसनीय है?
सभी नए SO उपयोगकर्ताओं के लिए: यह है कि आप एक प्रश्न कैसे पूछते हैं। +1 – tenfour
FWIW, मुझे MinGW का उपयोग कर g ++ 4.5.0 के साथ सही आउटपुट मिल रहा है। –
मुझे सभी मामलों के लिए 4.5 4.6 मिलते हैं। आपका जी ++ संस्करण क्या है? मेरे पास g ++ (डेबियन 4.3.2-1.1) 4.3.2 –