2009-09-19 17 views
13

मैं, दो अंकयह दुर्घटना क्यों नहीं है? क्या मैं यहां शून्य से विभाजित नहीं कर रहा हूं?

float slopeXY(CGPoint p1, CGPoint p2) 
{ 
    return ((p2.y - p1.y)/(p2.x - p1.x)); 
} 

से घिरा अगर मैं यह एक शून्य आकार लाइन देने के लिए एक लाइन की ढलान हो रही है

CGPoint p1 = CGPointMake(0, 10); 
CGPoint p2 = CGPointMake(0, 10); 

float sxy = slopeXY(p1, p2); 

मैं शून्य द्वारा विभाजन त्रुटि नहीं मिलता है।

+14

आपको शून्य से विभाजित करने का कोई तरीका मिल गया है। इस सावधानी से प्रयोग करें, या आप स्पेस-टाइम में एक छेद पिस सकते हैं और हमारी दुनिया अनंतता से निगल जाएगी। –

उत्तर

28

ओएस एक्स पर डिफ़ॉल्ट फ़्लोटिंग-पॉइंट पर्यावरण के साथ, शून्य द्वारा फ़्लोटिंग-पॉइंट डिवीजन एक जाल या अपवाद का कारण नहीं बनता है। 0.0/0.0 इसके बजाय एक NaN वापस कर देगा और fpscr में अमान्य फ़्लोटिंग-पॉइंट स्थिति ध्वज उठाएगा। 0.0 द्वारा गैर-शून्य मान को विभाजित करने से अनंतता वापस आ जाएगी और विभाजित-शून्य-शून्य ध्वज बढ़ाया जाएगा।

आप इन स्थितियों के लिए जाँच कर सकते हैं अगर आप की जरूरत है, isnan() और isinf() फ़ंक्शन math.h में परिभाषित

4

शून्य से विभाजित त्रुटि केवल पूर्णांक विभाजन के लिए होता है का उपयोग कर। फ्लोट के लिए, आमतौर पर आपको अनंतता मिलती है, जब तक कि लाभांश शून्य न हो।

1

फ़्लोटिंग-पॉइंट त्रुटियां आमतौर पर अपवाद नहीं उठाती हैं।

1

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

सी [99] स्टैंडर्ड से, §6.5.5.5:

/ऑपरेटर का परिणाम दूसरे से-सी युक्तियां संकार्य के विभाजन से भागफल है; का परिणाम% ऑपरेटर शेष है। दोनों परिचालनों में, यदि का दूसरा ऑपरेंड शून्य है, तो व्यवहार अव्यवस्थित है।

+4

व्यवहार * नहीं * अपरिभाषित है, क्योंकि ओएस एक्स कंपाइलर एक ही मानक के अनुलग्नक एफ के अनुरूप हैं। सी [99] की धारा F.3.1 कहती है "+, -, *, और/ऑपरेटरों आईईसी 60559 जोड़, घटाएं, गुणा करें, और संचालन विभाजित करें," और आईईसी 60559/आईईईई -754 शून्य से विभाजन का परिणाम निर्दिष्ट करता है। –

+0

ओह। क्या वह सिर्फ तैरने के लिए है? – aib

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