सी ++ को पोर्ट जावा कोड करने का प्रयास कर मैंने कुछ अजीब व्यवहार पर ठोकर खाई है। मुझे काम में दोगुना जोड़ा नहीं जा सकता है (भले ही कंपाइलर विकल्प/एफपी: सख्त जिसका अर्थ है "सही" फ्लोटिंग पॉइंट गणित विजुअल स्टूडियो 2008 में सेट है)।एक विशिष्ट विजुअल स्टूडियो 2008 प्रोजेक्ट में युगल गलत तरीके से क्यों जोड़े गए हैं?
double a = 0.4;
/* a: 0.40000000000000002, correct */
double b = 0.0 + 0.4;
/* b: 0.40000000596046448, incorrect
(0 + 0.4 is the same). It's not even close to correct. */
double c = 0;
float f = 0.4f;
c += f;
/* c: 0.40000000596046448 too */
एक अलग परीक्षण परियोजना में मैंने स्थापित किया है यह ठीक काम करता है (/ fp: आईईईई 754 के अनुसार सख्त व्यवहार करता है)।
कोई ऑप्टिमाइज़ेशन और एफपी: सख्त के साथ विजुअल स्टूडियो 2008 (मानक) का उपयोग करना।
कोई विचार? क्या यह वास्तव में तैरने के लिए छंटनी कर रहा है? इस परियोजना को वास्तव में जावा और सी ++ दोनों पक्षों पर समान व्यवहार की आवश्यकता है। मुझे वीसी ++ में डीबग विंडो से पढ़कर सभी मूल्य मिल गए।
समाधान: _fpreset(); // बैरी केली के विचार ने इसे हल किया। एक पुस्तकालय एफपी परिशुद्धता को कम करने के लिए सेटिंग कर रहा था।
क्या आप संकलित करने के लिए उपयोग की जाने वाली सटीक कमांड लाइन के साथ एक छोटा पूर्ण परीक्षण प्रोग्राम पोस्ट कर सकते हैं (आउटपुट विंडो आदि देखें), जो समस्या का प्रदर्शन करता है? एकमात्र तरीका जिसे मैं पुन: उत्पन्न कर सकता हूं वह इसके बजाय 0.0f + 0.4f का उपयोग कर रहा है। –
क्या हम मान सकते हैं कि आप फ़्लोटिंग पॉइंट प्रकारों के अपर्याप्तता से अवगत हैं? 7 दशमलव स्थानों पर सटीक होने के कारण आमतौर पर ठीक प्रिंटिंग परिशुद्धता 6. –
@Evan है, उसका उदाहरण फ़्लोटिंग पॉइंट अपर्याप्तता द्वारा समझाया जाएगा उससे अधिक है। – Kevin