2013-02-20 26 views
6

है यह असंगत लगता है कि स्काला में, शून्य से पूर्णांक गणित div एक java.lang.ArithmeticException:/by zero फेंकता है, लेकिन चल बिन्दु अंकगणितीय (1.0/0.0) रिटर्न Double.Infinityस्केला: क्यों 1/0 अंकगणितीय अपवाद लेकिन 1.0/0.0 = Double.Infinity

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

क्या कोई और चीज है जो मुझे याद आ रही है जो इन दो अलग-अलग व्यवहारों को बेहतर ढंग से समझाएगी?

+0

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

उत्तर

15

यह एक हार्डवेयर सीमा, नहीं एक सॉफ्टवेयर एक है, और वजह साफ है: IEEE754 फ्लोटिंग बिंदु गणित स्पष्ट +Inf और -Inf, का समर्थन करता है यानी वहाँ बिट अभ्यावेदन कि उन दो विचारों के अनुरूप हैं, और इसलिए यह उनके लिए समझ में आता है 1.0/0.0 का परिणाम बनने के लिए।

सामान्य प्रोसेसर में लागू इंटीजर अंकगणित में infinities के लिए आंतरिक प्रतिनिधित्व नहीं है, और इसलिए एक त्रुटि फेंकनी है।

आप सॉफ़्टवेयर में infinities का समर्थन करने वाले एक अभिन्न प्रकार को कार्यान्वित कर सकते हैं, लेकिन यह धीमा हो जाएगा क्योंकि एक विभाजन ऑपरेशन प्रोसेसर के div निर्देश से सीधे मेल नहीं खाता है। यह मेरी राय में समझदार नहीं है: इंटीजर div-by-zero त्रुटियां लगभग हमेशा (ए) आपके एल्गोरिदम के गलत कार्यान्वयन या (बी) उपयोगकर्ता इनपुट को सही तरीके से सत्यापित करने में विफलता के कारण हैं, जिनमें से दोनों मौलिक समस्याएं हैं अपवाद के माध्यम से रनटाइम पर नहीं, अपने कोड को संकलित करने से पहले निपटें! दूसरी तरफ एफपी अंकगणित में, आप आसानी से div-by-zero में चला सकते हैं जब आप इसे (और वास्तव में नहीं कर सकते) उम्मीद करते हैं: 1e-308/1e+308 का सही मान है, लेकिन यह double के रूप में प्रतिनिधित्व योग्य नहीं है, भले ही दोनों ऑपरेंड हैं ।

+0

आप कहते हैं "यह धीमा होगा"। हां, अगर आपको * प्रत्येक डिवीजन से पहले * शून्य की जांच की आवश्यकता है। लेकिन क्या आप सामान्य रूप से विभाजित नहीं कर सकते थे, और फिर किसी भी अपवाद को पकड़ सकते हैं? (मुझे स्कैला बिल्कुल नहीं पता।) –

+0

आप की तरह, मुझे नहीं पता कि एक 'कोशिश-पकड़' ब्लॉक जो अपवाद नहीं पकड़ता है, स्केल में बहुत अधिक ओवरहेड करता है। सबसे महत्वपूर्ण समस्या यह है कि यदि आप infinities को प्रचारित करना चाहते हैं तो आपको एक बार फिर से अपने प्रकार के बॉक्स को बॉक्स करने की आवश्यकता है - जो कि तब से एक अच्छा विचार नहीं हो सकता है * उन्हें पूर्णांक अंकगणित * में नहीं होना चाहिए। मैं एक पैराग्राफ जोड़ूंगा कि यह ऊपर क्यों है। – us2012

+0

@ जोसेफ मैंने एक पैराग्राफ जोड़ा है जिसमें मुझे लगता है कि मुझे लगता है कि int-div-by-0 हमेशा एक त्रुटि होनी चाहिए जबकि फ़्लोट-डीवी-बाय-शून्य को अलग-अलग इलाज करना समझ में आता है। – us2012