क्या एक कंप्यूटर शून्य से विभाजित करने का प्रयास करेगा?


59

हम सभी जानते हैं 0/0है Undefinedऔर एक त्रुटि देता है अगर मैं इसे एक कैलकुलेटर में डाल रहे थे, और (कम से कम सी में) अगर मैं एक कार्यक्रम बनाने के लिए थे ओएस इसे समाप्त जब मैं शून्य से विभाजित करने की कोशिश करेगा।

लेकिन मैं क्या सोच रहा था कि क्या कंप्यूटर भी शून्य से विभाजित करने का प्रयास करता है, या क्या यह सिर्फ "सुरक्षा में निर्मित" है, ताकि जब यह " 0/0गणना" करता है तो इसे गणना करने का प्रयास करने से पहले भी एक त्रुटि दिखाई देती है?


10
0/0 अपरिभाषित है, किसी भी अन्य संख्या / 0 में एक अलग तरह की त्रुटि है, आप दो को भ्रमित कर रहे हैं
edc65

7
0 से विभाजित कोई भी संख्या अपरिभाषित है, गणितीय रूप से बोल रही है।
मानदोस्तरा

12
@jwg: "अगर इसका मूल्य होता तो यह 1 होता" - जरूरी नहीं; गणित की पूरी शाखाएं हैं जो विभिन्न परिस्थितियों में मूल्य के लिए समर्पित हो सकती हैं :)
भजन

11
शब्दावली यहाँ स्पष्ट करने के लिए, 0/0 एक कहा जाता है अनिश्चित रूप जबकि एक्स / के लिए अशून्य 0 एक्स है अपरिभाषित । एक गणना जो 0/0 के साथ समाप्त होती है, अक्सर एक वास्तविक उत्तर देने के लिए एक अलग तरीके से गणना की जा सकती है, जबकि x / 0 अनिवार्य रूप से अर्थहीन है।
एरा

9
@jwg आपको l'hopital के नियम में दिलचस्पी हो सकती है। ऐसे मामले निश्चित रूप से होते हैं, जहां 0/0 1 का मान नहीं होता है
d0nut

जवाबों:


74

सीपीयू का पता लगाने में बनाया गया है। अधिकांश अनुदेश सेट आर्किटेक्चर निर्दिष्ट करते हैं कि सीपीयू पूर्णांक के लिए एक अपवाद हैंडलर को शून्य से विभाजित करेगा (मुझे नहीं लगता कि यह शून्य है तो परवाह करता है)।

यह संभव है कि एक शून्य विभाजक के लिए चेक विभाजन करने के प्रयास के साथ-साथ हार्डवेयर में समानांतर में होता है, हालांकि, आक्रामक स्थिति का पता लगाने के बजाय विभाजन और जाल को प्रभावी ढंग से रद्द कर देता है, इसलिए हम वास्तव में कुछ हिस्सा नहीं बता सकते हैं इसने विभाजन का प्रयास किया या नहीं।

(हार्डवेयर अक्सर इसी तरह काम करता है, कई चीजों को समानांतर में करता है और फिर बाद में उचित परिणाम चुनता है क्योंकि तब प्रत्येक ऑपरेशन को उचित संचालन की पसंद पर क्रमबद्ध करने के बजाय तुरंत शुरू किया जा सकता है।)

ओवरफ्लो डिटेक्शन चालू होने पर अपवाद तंत्र के समान जाल का भी उपयोग किया जाएगा, जिसे आप अलग-अलग ऐड / सब / म्यूल निर्देशों (या उन निर्देशों पर एक ध्वज) का उपयोग करके आमतौर पर पूछते हैं।

फ्लोटिंग पॉइंट डिवीजन भी शून्य से विभाजित करने के लिए पता लगाने में बनाया गया है, लेकिन एक अपवाद हैंडलर को फंसाने के बजाय एक अलग मूल्य ( IEEE 754 निर्दिष्ट NaN ) लौटाता है ।


हाइपोथेटिक रूप से कहें तो, यदि सीपीयू शून्य से विभाजित करने के प्रयास के लिए किसी भी पहचान को छोड़ देता है, तो समस्याएं शामिल हो सकती हैं:

  • सीपीयू को लटका देना (उदाहरण के लिए एक लूप में) - यह तब हो सकता है जब सीपीयू एक एल्गोरिथ्म का उपयोग करके विभाजित करता है जो तब रुकता है जब अंश भाजक से कम (पूर्ण मूल्य में) होता है। इस तरह से लटका सीपीयू को दुर्घटनाग्रस्त करने के रूप में बहुत अधिक गिना जाएगा।
  • (संभवतः अनुमानित) कचरा उत्तर, यदि सीपीयू विभाजन के चरणों की अधिकतम संभव संख्या पर विभाजन को समाप्त करने के लिए एक काउंटर का उपयोग करता है (उदाहरण के लिए 31 या 32 एक 32-बिट मशीन पर)।

51
@ अकुश ए "सिस्टम क्रैश" वास्तव में ऐसा कुछ नहीं है जो सीपीयू स्तर पर होता है। सीपीयू का सबसे संभावित व्यवहार जो शून्य से विभाजित नहीं करता था, वह यह होगा कि यह बस विभाजन ऑपरेशन करता है, कुछ बकवास परिणाम पैदा करता है और चलता रहता है। जैसे जब आप दो पूर्णांक जोड़ते हैं जो अतिप्रवाह के लिए होता है।
Ixrec

6
फ़्लोटिंग पॉइंट के लिए, "NaN" और "ट्रैप" के बीच का विकल्प आमतौर पर FPU में झंडे लहराकर तय किया जाता है।
वेटिन

10
@Ankush मामले में क्या lxrec ने स्पष्ट नहीं किया था: जहां तक ​​सीपीयू का संबंध है, दुर्घटना जैसी कोई बात नहीं है।
user253751

7
@ अकुंश कुछ स्थितियों के कारण सीपीयू-स्तर "सिस्टम क्रैश" होता है। उन मामलों में हम थर्मल प्रोटेक्शन शटडाउन (ओवरहीट प्रोटेक्शन), ट्रिपल फॉल्ट और इसी तरह की स्थितियों जैसी चीजों के बारे में बात कर रहे हैं । लगभग हर दुर्घटना में आप आम उपयोग में आएंगे, जिसमें अवैध ऑपकोड शामिल हैं , जो किसी तरह से फंसने और उबरने से नियंत्रित होते हैं, या बस त्रुटि को अनदेखा करते हैं और संभावित अशुद्ध स्थिति में निष्पादन जारी रखते हुए शायद कुछ त्रुटि ध्वज सेट करते हैं।
बजे एक CVn

8
यदि आप शून्य से विभाजित नहीं करते हैं, तो परिणाम प्रोग्रामिंग समानता में होगा, "अपरिभाषित व्यवहार।" इसका मतलब है कि कंप्यूटर कुछ भी कर सकता है। यह हो सकता है, जैसा कि बर्गी उल्लेख करता है, एक छोटी गाड़ी लूप दर्ज करें और लटकाएं। यह बस बिट्स की कुछ अनिर्दिष्ट श्रृंखला का उत्पादन कर सकता है जो कि विभाजन तर्क के उनके कार्यान्वयन के बारे में हुआ था (याद रखें, एक कंप्यूटर गणितीय अर्थ में "विभाजित" नहीं करता है। यह दो संख्याओं पर एक ऑपरेशन करता है, जो विभाजन के काफी करीब है। कि हम आम तौर पर इसे "विभाजन" कहते हैं .. फ़्लोटिंग पॉइंट राउंडऑफ़ भी देखें)।
Cort Ammon

34

यह भाषा पर निर्भर करता है, संकलक पर, कि क्या आप पूर्णांक या फ्लोटिंग पॉइंट संख्या का उपयोग कर रहे हैं, और इसी तरह।

फ्लोटिंग पॉइंट नंबर के लिए, अधिकांश कार्यान्वयन IEEE 754 मानक का उपयोग करते हैं , जहां 0 से विभाजन को अच्छी तरह से परिभाषित किया गया है। 0/0 NaN (नॉट-ए-नंबर) का एक अच्छी तरह से परिभाषित परिणाम देता है , और x Inf 0 के लिए x / 0 या तो + इन्फिनिटी या -इनफिनिटी देता है, जो x के संकेत पर निर्भर करता है।

सी, सी ++ आदि भाषाओं में शून्य द्वारा विभाजन अपरिभाषित व्यवहार करता है। तो भाषा की परिभाषा के अनुसार, कुछ भी हो सकता है। खासकर ऐसी चीजें जो आप नहीं करना चाहते हैं। जब आप कोड लिखते हैं और जब आपका ग्राहक इसका उपयोग करता है तो डेटा को नष्ट करने के लिए पूरी तरह से ठीक काम कर रहा है। भाषा के दृष्टिकोण से, ऐसा मत करो । कुछ भाषाएं गारंटी देती हैं कि आपका एप्लिकेशन क्रैश हो जाएगा; यह उनके ऊपर है कि इसे कैसे लागू किया जाता है। उन भाषाओं के लिए, शून्य से विभाजन दुर्घटनाग्रस्त हो जाएगा।

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

यदि एक संकलक यह पता लगाता है कि जब आप किसी कोड को निष्पादित करते हैं तो शून्य से एक विभाजन होता है, और संकलक अपने उपयोगकर्ताओं के लिए अच्छा है, यह संभवतः आपको चेतावनी देगा, और एक अंतर्निहित "विभाजन" निर्देश उत्पन्न करेगा ताकि व्यवहार एक हो। वही।


22
"इंटेल 32 बिट और 64 बिट प्रोसेसर पर," डिवाइड "निर्देश आपके एप्लिकेशन को क्रैश कर देगा जब आप शून्य से विभाजित करने का प्रयास करेंगे।" प्रशस्ति पत्र की जरूरत। सीपीयू के पास अनुप्रयोगों के बारे में कोई विचार नहीं है, वे निर्देशों को निष्पादित करते हैं और (यदि हम एमएमयू को शामिल करते हैं) मेमोरी एक्सेस सीमा को लागू करते हैं (जब तक कि अंगूठी 0 में , या गैर-इंटेल-x86 आर्किटेक्चर में समकक्ष)। यह निर्देश अनुप्रयोग B के बजाय अनुप्रयोग A का हिस्सा है या ऑपरेटिंग सिस्टम घटक C CPU के लिए अप्रासंगिक है; क्या निर्देश इंस्ट्रक्शन एक्स हो सकता है या मेमोरी एड्रेस वाई का उपयोग प्रासंगिक है।
बजे एक CVn

1
@ माइकलकॉर्जिंग टिप्पणी में जोड़ने के लिए: ओएस के पास इस (और अन्य प्रकार की त्रुटियों) के आवेदन को नोट करने का तरीका है। खिड़कियों की दुनिया में यह वह EXCEPTION_INT_DIVIDE_BY_ZEROमूल्य है EXCEPTION_RECORDजिसमें (उम्मीद) संभाला जाएगा स्थापित अपवाद हैंडलिंग हैंडलिंग हैंडलर
user45891

1
कभी-कभी वे यह गारंटी देने के अलावा कुछ करते हैं कि आपका ऐप क्रैश हो जाएगा। उदाहरण के लिए, कई भाषाओं / प्लेटफार्मों की गारंटी है कि वे शून्य पर विभाजन पर एक अपवाद फेंक देंगे। फिर आप दुर्घटनाग्रस्त हुए बिना अपवाद को पकड़ और संभाल सकते हैं।
रीहैब

2
आप "हो सकता है" को "अन्य प्रोसेसर अलग व्यवहार कर सकते हैं" के भीतर हटा सकते हैं: PowerPC प्लेटफ़ॉर्म पर, विभाजन केवल शून्य पर विभाजन पर एक शून्य परिणाम उत्पन्न करता है। जो कि X86 प्लेटफॉर्म के विहंगम व्यवहार से कहीं अधिक उपयोगी है।
14

13

लगता है कि आप सोच रहे हैं कि क्या होगा अगर किसी ने सीपीयू बनाया जो स्पष्ट रूप से विभाजित करने से पहले शून्य के लिए जांच नहीं करता है। क्या होगा यह पूरी तरह से विभाजन के कार्यान्वयन पर निर्भर करता है। विवरण में जाने के बिना, एक प्रकार का कार्यान्वयन एक परिणाम पैदा करेगा जिसमें सभी बिट्स सेट हैं, उदाहरण के लिए 16-बिट सीपीयू पर 65535। एक और लटक सकता है।


1

लेकिन मैं क्या सोच रहा था कि क्या कंप्यूटर भी शून्य से विभाजित करने का प्रयास करता है, या क्या यह केवल "सुरक्षा में निर्मित" है, ताकि जब यह "0" देखता है तो यह गणना करने से पहले प्रयास में एक त्रुटि देता है?

चूंकि x/0कोई मतलब नहीं है, अवधि, कंप्यूटर को हमेशा शून्य से विभाजन के लिए जांचना चाहिए। यहां एक समस्या है: प्रोग्रामर यह गणना (a+b)/cकरने के लिए परेशान होने के बिना गणना करना चाहते हैं कि क्या गणना भी समझ में आती है। सीपीयू + संख्या प्रकार + ऑपरेटिंग सिस्टम + भाषा द्वारा शून्य से विभाजन की अंडर-द-हूड प्रतिक्रिया, या तो कठोर (उदाहरण के लिए, प्रोग्राम क्रैश) या कुछ अधिक सौम्य है (उदाहरण के लिए, ऐसा कोई मूल्य बनाएं जो कोई ऐसा न करे आईईईई फ्लोटिंग पॉइंट NaN, एक संख्या जो "नॉट ए नंबर" है) जैसी भावना ।

एक साधारण सेटिंग में, एक प्रोग्रामर से यह जानने की उम्मीद की जाती है कि क्या (a+b)/cसमझ में आता है। इस संदर्भ में, शून्य द्वारा विभाजन की जांच करने का कोई कारण नहीं है। यदि विभाजन शून्य से होता है, और यदि मशीन भाषा + कार्यान्वयन भाषा + डेटा प्रकार + ऑपरेटिंग सिस्टम की प्रतिक्रिया प्रोग्राम को क्रैश करने के लिए है, तो यह ठीक है। यदि प्रतिक्रिया एक मूल्य बनाने के लिए है जो अंततः कार्यक्रम में हर संख्या को प्रदूषित कर सकती है, तो ठीक है, भी।

न तो "कुछ कठोर" या "अत्यधिक सौम्य" उच्च विश्वसनीयता कंप्यूटिंग की दुनिया में करने के लिए सही चीज है। उन डिफ़ॉल्ट प्रतिक्रियाओं से एक मरीज की मौत हो सकती है, एक विमान दुर्घटनाग्रस्त हो सकता है, या गलत जगह पर बम विस्फोट कर सकता है। उच्च विश्वसनीयता वाले वातावरण में, एक प्रोग्रामर जो लिखता है, (a+b)/cउसे कोड समीक्षा के दौरान या आधुनिक समय में मृत्यु के लिए चुना जाएगा, संभवतः एक उपकरण द्वारा स्वचालित रूप से मृत्यु को चुना जाता है जो वर्बोटन निर्माणों की जांच करता है। इस वातावरण में, उस प्रोग्रामर को इसके बजाय div(add(a,b),c)(और संभवतः त्रुटि स्थिति के लिए कुछ जाँच) की तर्ज पर कुछ लिखना चाहिए था। हुड के नीचे, div(और भी add) फ़ंक्शन / मैक्रोज़ विभाजन को शून्य (या मामले में अतिप्रवाह) से बचाता है add। क्या है कि सुरक्षा की जरूरत बहुत कार्यान्वयन विशिष्ट है।


सिर्फ इसलिए कि NaN आपके द्वारा स्कूल में सीखी गई अंकगणित का पालन नहीं करता है, इसका मतलब यह नहीं है कि इसका कोई मतलब नहीं है। यह अलग-अलग अंकगणित का पालन करता है
केलथ

-2

हम अब तक जानते हैं कि x/0और 0/0अच्छी तरह से परिभाषित जवाब नहीं है। यदि आप 0/0वैसे भी गणना करने का प्रयास करते हैं तो क्या होता है?

आधुनिक प्रणाली में, गणना एमपीयू के भीतर सीपीयू में पारित की जाती है और इसे अवैध संचालन के रूप में चिह्नित किया जाता है NaN

बहुत पुराने सिस्टम पर, जैसे कि '80 के दशक के कंप्यूटर, जिनमें ऑन-चिप डिवीजन नहीं था, गणना जो भी सॉफ़्टवेयर चला रहा था, उसके द्वारा की गई थी। कुछ संभावित विकल्प हैं:

  • विभाजक की छोटी और छोटी प्रतियों को तब तक घटाएं जब तक कि मूल्य शून्य तक नहीं पहुंच जाता है और किस आकार की प्रतियों को ट्रैक कर लिया जाता है
    • यदि यह पहले घटाव से पहले शून्य की जांच करता है, तो यह जल्दी से बाहर निकल जाएगा और परिणाम होगा 0
    • यदि यह मानता है कि यह कम से कम एक बार घटाना करने में सक्षम होना चाहिए, तो परिणाम होगा 1
  • दोनों संख्याओं के लघुगणक की गणना करें, उन्हें घटाएं और परिणाम की शक्ति के लिए बढ़ाएं । उपरोक्त घटाव विधि की तुलना में एक बहुत ही अयोग्य विधि, लेकिन गणितीय रूप से मान्य है
    • एक अतिप्रवाह गणना करने की कोशिश कर रहा हो सकता है log(0)और सॉफ्टवेयर या तो अपनी त्रुटि से निपटने की दिनचर्या, या दुर्घटना का उपयोग करेगा
    • सॉफ्टवेयर यह मान सकता है कि सभी लॉगरिथम को निश्चित संख्या में चरणों में गणना की जा सकती है और एक बड़ा, लेकिन गलत मान दिया जा सकता है। चूँकि दोनों लघुगणक समान होंगे, इसलिए अंतर होगा 0और e 0 = 1, का परिणाम देगा1

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


3
यह प्रश्न पूर्णांक में शून्य से विभाजित करने के बारे में है, और पूर्णांक में ऐसा कुछ भी नहीं है NaN
डेविड हैमेन 21

3
विभाजन के परिणाम की गणना करने के लिए कोई सीपीयू लॉग की गणना और घटाव करने वाला नहीं है। लघुगणक निर्देश समय विभाजन से अधिक परिमाण के कई आदेश हैं। लॉग (0) का मान क्या है?
22

1
@David Hammen ओपी ने कभी भी पूर्णांक का उल्लेख नहीं किया, और न ही किसी ने इस प्रश्न पर टिप्पणी की। केवल जवाब में ही इंटेर्ज का उल्लेख किया गया है।
सीजे डेनिस

@wallyk मैंने पहले ही अपने जवाब में कहा था कि लॉगरिथम very inefficientविभाजन के लिए हैं। अंकगणित की लागत है (जोड़ = घटाव) <= गुणन <= विभाजन। यदि आपके पास एक MPU नहीं है जो समान संख्या में घड़ी चक्रों में विभाजन कर सकता है (आमतौर पर एक), तो विभाजन जोड़ और घटाव की तुलना में अधिक महंगा होता है और आमतौर पर गुणा से भी अधिक महंगा होता है।
CJ डेनिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.