2012-06-20 16 views
14

मैंने इसे कई स्थानों पर देखा है जहां (int)someValue गलत है और इसके बजाय समस्या round() फ़ंक्शन के लिए बुलाई गई है। दोनों के बीच क्या अंतर है?कास्ट वेरिएबल टू इंट बनाम राउंड() फ़ंक्शन

विशेष रूप से, यदि आवश्यक हो, तो सी 99 सी के लिए मैंने जावा में लिखते समय अपने कार्यक्रमों में भी यही समस्या देखी है।

+0

यह भी दिलचस्प बात मैंने पहले कभी नहीं सुना: "निकटतम दौर भी डिफ़ॉल्ट आईईईई राउंडिंग मोड है।" - https://randomascii.wordpress.com/2014/01/27/theres-only-four-billion-floatsso-test-them-all/ – cmp

उत्तर

14

int करने के लिए एक float/double मूल्य कास्टिंग के मामले में, आप आमतौर पर आंशिक हिस्सा पूर्णांक काट-छांट की वजह से ढीला।

यह, गोलाई के रूप में हम आम तौर पर उम्मीद करेंगे से काफी अलग है तो के लिए उदाहरण 2.8 पूर्णांक काट-छांट के साथ 2 के रूप में समाप्त होता है, 2.1 के रूप में 2.

अद्यतन अंत होगा बस के रूप में:

एक और कास्टिंग के साथ संभावित (सकल) गलतता का स्रोत पूर्णांक के साथ पूर्णांक के साथ प्रतिनिधित्व करने में सक्षम होने वाले मूल्यों की सीमित सीमा के कारण है (नीचे हमें टिप्पणी में इस बारे में याद दिलाने के लिए @R के लिए धन्यवाद)

+0

मुझे समझ में नहीं आता कि ये समस्या क्यों सेट होती है (कॉम्पीशन या हार्वर्ड के ऑनलाइन सीएस 50 के लिए) दौर() का उपयोग करें और छात्रों को विशेष रूप से int का उपयोग करने के लिए बताएं ताकि वे _down_ के चारों ओर घूम सकें। यह बहुत परेशान है क्या आपको नहीं लगता? वैसे भी, धन्यवाद। – cmp

+1

कास्टिंग या अंतर्निहित रूप से एक पूर्णांक में परिवर्तित करने के साथ एक और मुद्दा यह है कि बड़े-आयाम मान नष्ट हो जाते हैं। यहां तक ​​कि जब आप एक पूर्ण-संख्या परिणाम चाहते हैं, तब भी फ़्लोटिंग-पॉइंट प्रकार को रखना सबसे अच्छा होता है, इसलिए बड़ी-बड़ी संख्या को संरक्षित किया जाता है। 'राउंड', 'फर्श', 'रिंट' इत्यादि जैसे कार्य ऐसा कर सकते हैं। –

+0

@ आर * उत्कृष्ट * बिंदु, प्रतिनिधित्व करने में सक्षम होने वाले मूल्यों की सीमा निश्चित रूप से पूर्णांक के साथ सीमित है। मुझे लगता है कि मैं इसके बारे में एक नोट मेरे जवाब में जोड़ दूंगा। धन्यवाद। – Levon

6
  1. int पर कास्टिंग एक फ़्लोटिंग-पॉइंट नंबर को छोटा करता है, यानी, यह आंशिक भाग को छोड़ देता है।
  2. round फ़ंक्शन निकटतम पूर्णांक देता है। हाफवे के मामलों को शून्य से दूर किया जाता है, उदाहरण के लिए, round(-1.5)-2 और round(1.5)2 है। neare करने के लिए अपने तर्क दौर

7.12.9.6 दौर कार्यों

सार

#include <math.h> 
double round(double x); 
float roundf(float x); 
long double roundl(long double x); 

विवरण

round कार्यों वर्तमान 0 राउंडिंग दिशा के बावजूद सेंट फ़्लोटिंग-पॉइंट प्रारूप में पूर्णांक मान, आधे रास्ते के मामलों को शून्य से दूर करें।

रिटर्न

round कार्यों गोल पूर्णांक मान लौट आते हैं।

स्रोत: सी 99 मानक (ISO/IEC 9899:1999)। यह अनुभाग सी 11 मानक (ISO/IEC 9899:2011) में नहीं बदला था।

(जो रुचि रखते हैं के लिए, here गोलाई एल्गोरिदम के लिए एक स्पष्ट परिचय है।)

+1

बस एक नोट, गोलाकार व्यवहार अपेक्षित और भाषा से भिन्न हो सकता है। उदाहरण के लिए, मैंने हाल ही में पाया कि पाइथन 3.x राउंड निकटतम * यहां तक ​​कि * संख्या .. जो वास्तव में मुझे फेंक दिया। तो, दस्तावेज़ीकरण की जांच करना हमेशा अच्छा होता है। मैं अपने सी प्रोग्रामिंग दिनों से विश्वास करता हूं कि सी का व्यवहार आम अपेक्षाओं के अनुरूप है। – Levon

+0

@ लेवन दिलचस्प ... और डरावना :) – kol

+0

यूप, मुझे भी आश्चर्यचकित कर दिया। इसे "बैंकर राउंडिंग" के रूप में जाना जाता है। – Levon

1
सी के लिए विशेष रूप से

, यह (शायद) है कि ज्यादातर मामलों कास्टिंग ट्रंकेटस, तथापि, तुम हमेशा परिणाम का परीक्षण करना चाहिए में सच सुनिश्चित होना।

कास्टिंग के साथ समस्या यह है कि यह किसी भी छिड़काव या गोल कर सकता है। यह क्या करता है मुख्य रूप से प्रोग्रामिंग भाषा पर निर्भर करता है, जो कि विशिष्ट संकलक पर मामूली रूप से उपयोग किया जाता है। जिसका अर्थ है कि परिणाम के लिए कोई सामान्य नियम नहीं है जो हमेशा लागू होगा।

गोल() सार्वभौमिक रूप से गणितीय दौर के समान परिणाम उत्पन्न करने के लिए प्रयोग किया जाता है। एक एज केस है जिसे विशेष रूप से .5 के लिए निगरानी की आवश्यकता होती है, जो कभी-कभी अगले नंबर तक भी जाती है।

संबंधित मुद्दे