नकारात्मक शून्य क्यों महत्वपूर्ण है?


64

मैं इस बारे में उलझन में हूं कि हम सकारात्मक और नकारात्मक शून्य के लिए अलग-अलग प्रतिनिधित्व की परवाह क्यों करते हैं।

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

अवधारणा पर विकिपीडिया का लेख विशेष रूप से उपयोगी नहीं है; अगर यह सही ढंग से समझ में आता है, तो यह केवल शून्य पर हस्ताक्षर करने के बारे में अस्पष्ट गणितीय कार्यों को सरल बनाता है। यह उत्तर कुछ ऐसे कार्यों को सूचीबद्ध करता है जो अलग तरह से व्यवहार करते हैं, और शायद कुछ उदाहरणों से अनुमान लगाया जा सकता है यदि आप परिचित हैं कि उनका उपयोग कैसे किया जा सकता है। (हालांकि, जटिल वर्गमूल का विशेष उदाहरण गलत दिखता है, क्योंकि दो नंबर गणितीय रूप से समतुल्य हैं, जब तक कि मुझे कोई गलतफहमी न हो।) लेकिन मैं इस तरह की परेशानी का एक स्पष्ट बयान खोजने में असमर्थ रहा हूं कि अगर आप वहां नहीं होते। जितने अधिक गणितीय संसाधन मैंने यह पाया है कि गणितीय दृष्टिकोण से दोनों में कोई अंतर नहीं है, और विकिपीडिया के लेख से लगता है कि यह सीमा का वर्णन करने से अलग कंप्यूटिंग के बाहर शायद ही कभी देखा गया हो।

तो कंप्यूटिंग में एक नकारात्मक शून्य मूल्यवान क्यों है? मुझे यकीन है कि मुझे कुछ याद आ रहा है।


6
IEEE फ्लोटिंग पॉइंट संख्या में नकारात्मक शून्य अंडरफ्लो का संकेत दे सकता है, लेकिन इससे परे, इसका उपयोग विवादास्पद और अस्पष्ट प्रतीत होता है। अगर मुझे लगता था, तो मैं कहूंगा कि आईईईई फ्लोटिंग पॉइंट में नकारात्मक शून्य का प्रतिनिधित्व किया जाता है क्योंकि ... ठीक है, आप कर सकते हैं। एक और भी दिलचस्प सवारी के लिए, फ्लोटिंग पॉइंट सिग्नलिंग NaN पर जानकारी देखें।
रॉबर्ट हार्वे

1
यदि विशेष उदाहरण "1 / 0.0" / "1 / -0.0" है, तो 0 1 / x के लिए एक शाखा कट है और सीमा इस पर निर्भर करती है कि क्या आप इसे नीचे या ऊपर से अप्रोच करते हैं।
वैटीन

@Vatine नहीं, विशेष उदाहरण है sqrt(-1+0i) = iऔर sqrt(-1-0i) = -i, हालांकि कुछ प्रोग्रामिंग भाषा के लिए उचित वाक्यविन्यास के साथ कपड़े पहने, मुझे विश्वास है। मैं और अधिक स्पष्ट होने के लिए संपादन करूँगा।
jpmc26

3
मैंने प्रोग्रामर्स , स्टैक ओवरफ्लो , कंप्यूटर साइंस , गणित और इंजीनियरिंग की खोज की । एकमात्र प्रश्न जो मुझे मिल सकता था वह था नकारात्मक शून्य फ्लोटिंग पॉइंट वैल्यू के लिए उपयोग? । यह केवल दूसरी बार नहीं आया है जब यह सामने आया है!

मैं वास्तव में हैरान हूं कि जटिल संख्याएं जवाबों में बिल्कुल नहीं आई हैं, विशेष रूप से वर्गमूल उदाहरण मैंने दिया है।
jpmc26

जवाबों:


69

आपको यह ध्यान रखने की आवश्यकता है कि FPU अंकगणित में, 0 का मतलब बिल्कुल शून्य होना जरूरी नहीं है, लेकिन दिए गए डेटाटाइप का उपयोग करते हुए प्रतिनिधित्व करने के लिए बहुत छोटा भी है, जैसे

a = -1 / 1000000000000000000.0

ए फ्लोट (32 बिट) द्वारा सही ढंग से प्रस्तुत किया जाने वाला बहुत छोटा है, इसलिए इसे -0 तक "गोल" किया जाता है।

अब, मान लें कि हमारी गणना जारी है:

b = 1 / a

क्योंकि एक फ्लोट है, इसके परिणामस्वरूप इनफिनिटी होगी जो -100000000000000000000 के सही उत्तर से काफी दूर है

अब चलो b की गणना करें यदि कोई -0 नहीं है (तो यह +0 के लिए गोल है):

b = 1 / +0
b = +infinity

गोलाई के कारण परिणाम फिर से गलत है, लेकिन अब यह "अधिक गलत" है - न केवल संख्यात्मक रूप से, बल्कि अलग-अलग संकेत के कारण महत्वपूर्ण रूप से अधिक है (गणना का परिणाम + अनंत है, सही परिणाम -1000000000000000000.0 है)।

आप अभी भी कह सकते हैं कि यह वास्तव में मायने नहीं रखता क्योंकि दोनों गलत हैं। महत्वपूर्ण बात यह है कि बहुत सारे संख्यात्मक अनुप्रयोग हैं जहां संगणना का सबसे महत्वपूर्ण परिणाम संकेत है - उदाहरण के लिए जब कुछ मशीन लर्निंग एल्गोरिदम का उपयोग करके चौराहे पर बाईं या दाईं ओर मुड़ना है, तो आप सकारात्मक मान => बारी की व्याख्या कर सकते हैं बाएं, ऋणात्मक मान => दाएं मुड़ें, मूल्य का वास्तविक "परिमाण" सिर्फ "आत्मविश्वास गुणांक" है।


क्या आपके पास इस पर कोई विचार है कि क्या अंडरफ़्लो का संकेत विशेष रूप से काल्पनिक / जटिल संख्या गणना में महत्वपूर्ण हो सकता है?
jpmc26

@qbd: क्या आप जानते हैं कि वे संख्यात्मक अनुप्रयोग क्या हैं? मैं कहूंगा कि ऐसे प्रोग्राम जो ट्रिगर करते हैं और उपयोग करते हैं +infऔर -infसामान्य ऑपरेशन में बग होते हैं।
ब्योर्न लिंडक्विस्ट

@ BjörnLindqvist यदि आप ठोस, डाउनलोड करने योग्य अनुप्रयोग चाहते हैं - तो मुझे कोई जानकारी नहीं है। मुझे नहीं लगता कि यह आवश्यक रूप से छोटी गाड़ी है - फ्लोट / डबल के बजाय आप असीमित परिशुद्धता के साथ बिगडेसीमल जैसे कुछ का उपयोग कर सकते हैं। लेकिन क्या यह इसके लायक है जब कार्यक्रम फ्लोट / डबल के साथ ठीक उसी तरह के परिणाम देगा, लेकिन बहुत खराब प्रदर्शन के साथ?
qbd

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

1
@ BjörnLindqvist x265 का बड़ा हिस्सा असेंबली में किया जाता है, जो इसके अस्पष्ट विवरण (जो सीपीयू वास्तुकला पर निर्भर हैं) पर निर्भर करता है, कुछ लोग प्रदर्शन के नाम पर जानते हैं। क्या यह ग़लत है? व्यापक रूप से लागू किए गए 30 साल पुराने मानक (जो यहां रहना है) पर भरोसा करना, एक सरल, प्रदर्शन के नाम पर अच्छी तरह से समझी जाने वाली सुविधा के लिए अचानक इतना बुरा नहीं लगता है।
qbd

8

पहला, आप -0 कैसे बनाते हैं? दो तरीके हैं: (1) एक फ्लोटिंग-पॉइंट ऑपरेशन करते हैं जहां गणितीय परिणाम नकारात्मक होता है, लेकिन शून्य के इतना करीब कि यह शून्य पर गोल हो जाता है, न कि शून्य संख्या के लिए। वह गणना -0 दे देगी। (b) शून्य से जुड़े कुछ ऑपरेशन: एक ऋणात्मक शून्य को एक ऋणात्मक संख्या से गुणा करें, या एक ऋणात्मक शून्य को ऋणात्मक संख्या से विभाजित करें, या एक सकारात्मक शून्य को नकारात्मक करें।

ऋणात्मक शून्य होने से गुणा और भाग थोड़ा सरल हो जाता है, x * y या x / y का चिन्ह हमेशा x, अनन्य या y के चिन्ह का चिन्ह होता है। नकारात्मक शून्य के बिना, -0 के साथ -0 को बदलने के लिए कुछ अतिरिक्त जांच करनी होगी।

कुछ बहुत दुर्लभ स्थितियाँ हैं जहाँ यह उपयोगी है। आप जांच सकते हैं कि गुणा या भाग का परिणाम गणितीय रूप से शून्य से कम या अधिक है, भले ही कोई अंतर्प्रवाह हो (जब तक आप जानते हैं कि परिणाम गणितीय शून्य नहीं है)। मुझे कभी भी लिखित कोड याद नहीं आ रहा है जहाँ इससे कोई फर्क पड़ता है।

ऑप्टिमाइज़िंग कंपाइलर -0 से नफरत करते हैं। उदाहरण के लिए, आप x + 0.0 को x से प्रतिस्थापित नहीं कर सकते, क्योंकि यदि x -0.0 है तो परिणाम x नहीं होना चाहिए। आप x * 0.0 को 0.0 के साथ प्रतिस्थापित नहीं कर सकते, क्योंकि परिणाम -0.0 होना चाहिए यदि x <0 या x -0.0 है।


7
मेरी इच्छा है कि IEEE-754 में चार शून्य शामिल थे: "सटीक", पॉजिटिव इन्फिनिटेसिमल, निगेटिव इन्फिनिटिसिमल, और अहस्ताक्षरित (बाद में अविभाज्य मूल्यों के बीच अंतर)। ऐसा करने से बहुत सारे फ्लोटिंग-पॉइंट एक्सीलॉम्स काम करने लगते हैं - उनमें से, x + 0.0 इक्विव x-0.0 इक्विव x, xy इक्विव x + (- 1.0) * y, और 1.0 / x इक्विव -1.0 / (- 1.0 #) x) [यदि x धनात्मक शून्य है, तो दोनों पॉस-इन होंगे; यदि नकारात्मक-शून्य, दोनों नकारात्मक-inf; यदि सटीक या अहस्ताक्षरित, दोनों NaN]।
सुपरकैट १।

मैं गुजर कर -5और 5में एक नकारात्मक शून्य प्राप्त करने में सक्षम था fmod()। यह मेरे उपयोग के मामले के लिए काफी कष्टप्रद है।
एरोन फ्रेंके

6

सी # डबल जो IEEE 754 के अनुरूप है

    double a = 3.0;
    double b = 0.0;
    double c = -0.0;

    Console.WriteLine(a / b);
    Console.WriteLine(a / c);

प्रिंट:

Infinity
-Infinity

वास्तव में थोड़ा समझाने के लिए ...

Double d = -0.0; 

इसका अर्थ है d = The Limit of x as x approaches 0-या के बहुत करीब The Limit of x as x approaches 0 from the negatives


फिलीपींस की टिप्पणी को संबोधित करने के लिए ...

मूल रूप से ऋणात्मक शून्य का अर्थ है अंडरफ्लो।

नकारात्मक शून्य के लिए बहुत कम व्यावहारिक उपयोग अगर कोई है ...

उदाहरण के लिए, यह कोड (फिर C #):

double a = -0.0;
double b = 0.0;

Console.WriteLine(a.Equals(b));
Console.WriteLine(a==b);
Console.WriteLine(Math.Sign(a));

इसका परिणाम मिलता है:

True
True
0

अनौपचारिक रूप से समझाने के लिए, सभी विशेष मान IEEE 754 फ्लोटिंग पॉइंट हो सकते हैं (सकारात्मक अनंत, नकारात्मक अनंत, NAN, -0.0) का व्यावहारिक अर्थ में कोई अर्थ नहीं है। वे किसी भी भौतिक मूल्य या किसी भी मूल्य का प्रतिनिधित्व नहीं कर सकते हैं जो "वास्तविक दुनिया" गणना में समझ में आता है। वे क्या मतलब है मूल रूप से यह है:

  • सकारात्मक अनंत का मतलब है सकारात्मक अंत में एक अतिप्रवाह एक अस्थायी बिंदु का प्रतिनिधित्व कर सकता है
  • नकारात्मक अनंत का मतलब है सकारात्मक छोर पर एक अतिप्रवाह एक अस्थायी बिंदु का प्रतिनिधित्व कर सकता है
  • नकारात्मक शून्य का अर्थ है एक अंतर्प्रवाह और ऑपरेंड के विपरीत संकेत थे
  • धनात्मक शून्य का अर्थ हो सकता है एक अंतर्प्रवाह और ऑपरेंड का एक ही चिन्ह हो
  • NAN का अर्थ है कि आपकी गणना जटिल रूप से अपरिभाषित है, जैसे sqrt(-7), या इसकी सीमा नहीं है 0/0या जैसी हैPositiveInfinity/PositiveInfinity

7
हां, लेकिन यह महत्वपूर्ण क्यों है? क्या आप एक व्यावहारिक, वास्तविक दुनिया उदाहरण प्रदान कर सकते हैं जहां अंतर मायने रखता है?
फिलिप

5

सवाल यह है कि यह जटिल-संख्या गणना से कैसे संबंधित है, यह वास्तव में दिल में आता है कि क्यों +0 और -0 दोनों फ्लोटिंग-पॉइंट में मौजूद हैं। यदि आप कॉम्प्लेक्स एनालिसिस का अध्ययन करते हैं, तो आपको तेजी से पता चलता है कि कॉम्प्लेक्स से कॉम्प्लेक्स तक के निरंतर कार्यों को आमतौर पर 'एकल-मूल्यवान' के रूप में नहीं माना जा सकता है जब तक कि कोई 'विनम्र कल्पना' नहीं अपनाता है कि आउटपुट फॉर्म को 'रीमैन सतह' के रूप में जाना जाता है। उदाहरण के लिए, जटिल लघुगणक प्रत्येक इनपुट को असीम रूप से कई आउटपुट प्रदान करता है; जब आप एक निरंतर आउटपुट बनाने के लिए उन्हें 'कनेक्ट' करते हैं, तो आप मूल के चारों ओर एक 'अनंत कॉर्कस्क्रू' सतह बनाने वाले सभी वास्तविक भागों के साथ समाप्त होते हैं। एक निरंतर वक्र जो वास्तविक अक्ष को 'सकारात्मक-काल्पनिक पक्ष से नीचे की ओर' पार करता है और दूसरा वक्र जो 'ध्रुव के चारों ओर लपेटता है' और वास्तविक अक्ष को पार करता है '

अब इसे एक संख्यात्मक कार्यक्रम पर लागू करें जो जटिल फ्लोटिंग-पॉइंट का उपयोग करके गणना करता है। किसी दिए गए गणना के बाद की गई कार्रवाई बहुत भिन्न हो सकती है, जिसके आधार पर कार्यक्रम 'वर्तमान में' पर 'शीट' है, और अंतिम गणना परिणाम का संकेत संभवतः आपको बताता है कि कौन सी 'शीट' है। अब मान लीजिए कि परिणाम शून्य था? याद रखें, यहाँ 'शून्य' का सही अर्थ है 'सही ढंग से प्रतिनिधित्व करने के लिए बहुत छोटा'। लेकिन यदि गणना संकेत को -प्रदर्शन की व्यवस्था कर सकती है- (अर्थात याद रखें कि कौन सी 'शीट') जब परिणाम शून्य है, तो कोड संकेत की जांच कर सकता है और इस स्थिति में भी सही कार्रवाई कर सकता है।


1

इसका कारण सामान्य से अधिक सरल है

बेशक, बहुत सारे हैक हैं जो वास्तव में अच्छे दिख रहे हैं और वे उपयोगी हैं (जैसे कि गोल करना -0.0या करना +0.0लेकिन हमारे पास शुरुआत में ऋण / प्लस चिन्ह के साथ हस्ताक्षरित इंट का प्रतिनिधित्व है (मुझे पता है कि यू 2 बाइनरी कोड द्वारा हल किया गया है) पूर्णांकों में आमतौर पर लेकिन दोहरे के कम जटिल प्रतिनिधित्व को मान लेते हैं):

0 111 = 7
^ sign

यदि नकारात्मक संख्या है तो क्या होगा?

1 111 = -7

ठीक है, वह सरल है। तो चलो 0 का प्रतिनिधित्व करते हैं:

0 000 = 0

वह भी ठीक है। लेकिन इससे क्या 1 000? क्या इसे निषिद्ध संख्या होना चाहिए? बेहतर नहीं।

तो मान लेते हैं कि दो प्रकार के शून्य हैं:

0 000 = +0
1 000 = -0

ठीक है, यह हमारी गणना को सरल करेगा और सौभाग्य से कुछ अतिरिक्त सुविधाएं प्रदान करेगा। तो +0और -0सिर्फ बाइनरी प्रतिनिधित्व मुद्दों से आ रहे हैं।


6
अगर मैं इसे सही ढंग से पढ़ रहा हूं, तो आप अनिवार्य रूप से सिर्फ यह कह रहे हैं कि मानकों को परिभाषित करने या लागू करने वाले लोग इसे मना करने की परेशानी में नहीं जाना चाहते हैं। मुझे नहीं लगता कि यह तर्क इस तथ्य को रखता है कि 2 का पूरक पूरी तरह से अलग संख्या के लिए "नकारात्मक शून्य" प्रतिनिधित्व का उपयोग करता है और नकारात्मक शून्य का कोई प्रतिनिधित्व नहीं करता है। मेरे द्वारा लिंक किया गया विकिपीडिया लेख देखें।
jpmc26

1
@ jpmc26 मुझे लगता है कि वास्तव में इसके लिए कुछ सच्चाई है, इसमें मना करने का मतलब यह नहीं है कि कार्यान्वयन के लिए विशेष मामले की आवश्यकता नहीं है। जैसा भी हो, हर नंबर पर एक साइन बिट होता है और साइन बिट को टॉगल करके इसे नकारा जा सकता है। यहां तक ​​कि NaN पर हस्ताक्षर किए जाते हैं, और NaN का उत्पादन करते समय कार्यान्वयन (लेकिन आवश्यक नहीं है) एक उचित संकेत चुन सकते हैं। अगर नकारात्मक शून्य मौजूद नहीं था, हर गणना कि 0 में हुई अतिरिक्त काम करने के लिए संकेत थोड़ा ठीक करने के लिए की आवश्यकता होगी, आदि
हॉब्स

4
@ jpmc26 (अर्थात दो अन्य संख्याओं के हर दूसरे गुणन में, परिणाम का चिन्ह गुणक के चिन्ह का xor होता है, और परिमाण दो परिमाणों का गुणनफल होता है। वास्तविक जीवन में यह -1 -1 = 0 के लिए कार्य करता है)। 0. लेकिन अगर साइन बिट के साथ शून्य फ़्लिप किया गया तो कुछ विशेष नॉनज़ेरो वैल्यू थी, प्रत्येक उत्पाद जो 0 का उत्पादन कर सकता था, उसे जाँचना होगा और यह सुनिश्चित करना होगा कि यह गलती से उस विशेष मूल्य का उत्पादन नहीं करता है।)
हॉब्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.