2010-09-22 23 views
8

मैं बस कोड की इस पंक्ति में भाग गया:क्या है (डबल) वैध सी ++?

if(lineDirection.length2()){...} 

जहां length2double देता है। यह मुझे पहेली की तरह है कि 0.0 0, NULL, और/या false के बराबर है।

क्या सी ++ मानक का यह हिस्सा है या यह अनिर्धारित व्यवहार है?

+1

कोड की ब्रितलता को इंगित करने के लिए NaN –

उत्तर

9

यह एक बहुत ही ज्यादा स्टैंडर्ड व्यवहार (बूलियन रूपांतरण) है

$ 4,12/1 - " सदस्य प्रकार के गणित, गणन, सूचक, या सूचक का एक rvalue के rvalue में बदला जा सकता बूल टाइप करें। शून्य मान, शून्य सूचक मूल्य, या शून्य सदस्य सूचक मूल्य को गलत में परिवर्तित किया गया है; कोई अन्य मान सत्य में परिवर्तित हो गया है। "

5

हां - तुलना शून्य (0.0) के विरुद्ध है, और परिणाम शून्य है, और अन्यथा सच है तो झूठी वापसी करता है।

व्यवहार सी से विरासत में मिला है, जो समकक्ष समान तरीके से व्यवहार करता है।

0

जब आप ऑपरेटरों के बिना तुलना करते हैं, तो आप "सत्य के खिलाफ" तुलना कर रहे हैं, ताकि प्रत्येक चर प्रकार को या तो बूलियन (सरल मामला) या अन्य माना जा सके। संख्यात्मक परिवर्तनीय प्रकारों में उनके झूठे मान को "0", "0.0" या उसके रूप में परिभाषित किया गया है, इसलिए जब आप उन्हें "सत्य के विरुद्ध" तुलना करते हैं, तो आपकी तुलना झूठी हो जाएगी।

7

यह ध्यान देने योग्य है कि यह कोड फ़्लोटिंग-पॉइंट प्रस्तुतियों के लिए बेहद भंगुर है। यह कोड काम करेगा अगर केवल तभी फ़्लोटिंग पॉइंट मान बिल्कुल 0 है, जो वास्तव में अधिकांश परिस्थितियों में बहुत ही असंभव है। यह इस विशेष मामले में नहीं हो सकता है, लेकिन अगर निश्चित रूप से इसे दस्तावेज/टिप्पणी की जानी चाहिए।

व्यावहारिक रूप से अन्य सभी परिस्थितियों में आपको "epsilon value" पर निर्णय लेने की आवश्यकता है जो फ़्लोटिंग पॉइंट नंबरों की सीमा को परिभाषित करता है जिसे आप "समान" मानते हैं - अन्यथा आपकी तुलना आपको कोने में आश्चर्यचकित करने की संभावना है (और अक्सर न तो कोने में) मामले।

+3

+1 के लिए भी देखें। यह कई स्थितियों में टूट जाएगा जो स्पष्ट नहीं हो सकते हैं: 'डबल डी = 0.0/-1.0; यदि (डी) ''0.0! = 0.0' के रूप में झूठी पैदा करता है, और यह कई अन्य परिचालनों के लिए जाता है जो' 0' मान के करीब पर्याप्त हो सकता है जो ** ** ** 0.0' –

+0

बस नहीं है सुनिश्चित हो। कोड "डबल एक्स = 0.0; यदि (x) {cout <<" x शून्य नहीं है ";}" प्रिंट "x शून्य नहीं है"? –

+3

@ डेविड रोड्रिगुएज़ - ड्राईबीस: नहीं, '-0.0 == 0.0', भले ही बिट पैटर्न अलग-अलग हों। यह गंभीर रूप से महत्वपूर्ण है। अभिव्यक्ति '(x == 0.0 || (1.0/x)) '_ot_ मूल्यांकन' 1.0/x' होगा जब यह शून्य से विभाजन का कारण बन जाएगा। – MSalters

0

यदि लंबाई 2 लौटाता है तो इसे गलत के रूप में लिया जाएगा। लेकिन आपको इस तुलना के साथ आश्चर्यजनक परिणाम मिल सकता है। फ्लोटिंग पॉइंट तुलना के दौरान मैडकिथवी के सुझाव के रूप में बेहतर ईपीएसलॉन मूल्य का उपयोग करें।

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