क्या कोई इस व्यवहार को समझा सकता है? मैं फ्लोटिंग पॉइंट नंबरों के मशीन-स्तरीय प्रतिनिधित्व के बारे में अच्छी तरह से अवगत हूं। ऐसा लगता है कि printf और इसके प्रारूपों से संबंधित है। दोनों संख्याओं को वास्तव में फ़्लोटिंग-पॉइंट नोटेशन द्वारा दर्शाया गया है (चेक: 64 से गुणा एक पूर्णांक देता है)।युगल के लिए प्रिंटफ राउंडिंग व्यवहार
#include <stdio.h>
#include <iostream>
using namespace std;
int main() {
double x1=108.765625;
printf("%34.30f\n", x1);
printf("%9.5f\n", x1);
printf("%34.30f\n", x1*64);
double x2=108.046875;
printf("%34.30lf\n", x2);
printf("%9.5f\n", x2);
printf("%34.30f\n", x2*64);
}
आउटपुट:
> 108.765625000000000000000000000000
> 108.76562
> 6961.000000000000000000000000000000
> 108.046875000000000000000000000000
> 108.04688
> 6915.000000000000000000000000000000
ध्यान दें, पहली संख्या पूर्णांक हो जाता है, और दूसरा एक को गिरफ्तार किया जाता है।
आपको मेरे लेख http://www.exploringbinary.com/inconsistent-rounding-of-printed-floating-point-numbers/ में रुचि हो सकती है। कुछ कार्यान्वयन "राउंड-आधा-से-यहां तक" के बजाय "राउंड-आधा-से-शून्य" का उपयोग करते हैं। –
ऐसा प्रतीत होता है कि माइक्रोसॉफ्ट ने वीएस 2010 और वीएस2015 के बीच कुछ समय अपने डिफ़ॉल्ट गोलाकार व्यवहार को बदल दिया। मैंने बस एक से दूसरे में अपग्रेड किया और कुछ बहुत परेशान और सूक्ष्म बग मिला। [यह ब्लॉग] (https://blogs.msdn.microsoft.com/vcblog/2014/06/18/c-runtime-crt-features-fixes-and-breaking-changes-in-visual-studio-14-ctp1 /) शायद परिवर्तन को हाइलाइट करने के लिए है, लेकिन इसे पूरी तरह से याद करने के लिए आपको क्षमा किया जाएगा। – omatai
यह कार्यान्वयन पर निर्भर करता है [स्प्रिंटफ में विंडोज बनाम यूनिक्स आधारित सिस्टम पर राउंडिंग मतभेद] (http://stackoverflow.com/q/4649554/995714), [सी ++ स्प्रिंटफ के साथ संबंधों के लिए राउंडिंग व्यवहार स्थिरता] (http: // stackoverflow। कॉम/क्यू/31142600/995714) –