कोई ऐतिहासिक कारण नहीं है। इस तरह का विचलन वर्ष डॉट के बाद से है। लोक ऐसा तब करते हैं जब वे बहुत, बहुत शरारती महसूस कर रहे होते हैं। यह फ्लोटिंग पॉइंट अंकगणित का दुरुपयोग है, और कई अनुभवी पेशेवर प्रोग्रामर इसके लिए आते हैं। यहां तक कि जावा बॉड्स ने संस्करण 1.7 तक किया। मजाकिया लड़के।
मेरा अनुमान है कि सी -11 (C99 C में अपने होने के बावजूद) तक एक अच्छा आउट-ऑफ-द-बॉक्स जर्मन राउंडिंग फ़ंक्शन औपचारिक रूप से उपलब्ध नहीं था, लेकिन यह वास्तव में तथाकथित विकल्प को अपनाने के लिए कोई बहाना नहीं है।
यहाँ बात है: floor(0.5 + input)
हमेशा इसी std::round
कॉल के रूप में एक ही परिणाम ठीक नहीं है !
कारण काफी सूक्ष्म है: a.5
एक पूर्णांक के लिए एक जर्मन गोलाई के लिए कटऑफ बिंदु a
, ब्रह्मांड की एक संयोग संपत्ति, एक रंगादिक तर्कसंगत है । जैसा कि यह IEEE754 में 2 के 52 वें पावर तक फ्लोटिंग पॉइंट के रूप में दर्शाया जा सकता है, और इसके बाद राउंडिंग वैसे भी नो-ऑप है, std::round
हमेशा ठीक से काम करता है। अन्य फ़्लोटिंग पॉइंट योजनाओं के लिए, दस्तावेज़ से परामर्श करें।
लेकिन कैन 0.5
को जोड़ने से double
कुछ मूल्यों के लिए थोड़ी सी भी कमी हो सकती है। यदि आप इसके बारे में सोचते हैं, तो दो double
मूल्यों को एक साथ जोड़ते हैं - जो कि अस्वाभाविक इनकार रूपांतरण की स्थापना है - और एक फ़ंक्शन लागू करना जो इनपुट का एक बहुत मजबूत कार्य है (जैसे कि एक राउंडिंग फ़ंक्शन), आँसू में समाप्त होने के लिए बाध्य है।
यह मत करो ।
संदर्भ: Math.round (0.49999999999999994) 1 क्यों आता है?