ECMAScript 5.1 विनिर्देशन के माध्यम से पढ़ना , +0
और -0
प्रतिष्ठित हैं।
फिर +0 === -0
मूल्यांकन क्यों करता है true
?
Object.is
+0 और -0 को भेद करने के लिए उपयोग कर सकते हैं
ECMAScript 5.1 विनिर्देशन के माध्यम से पढ़ना , +0
और -0
प्रतिष्ठित हैं।
फिर +0 === -0
मूल्यांकन क्यों करता है true
?
Object.is
+0 और -0 को भेद करने के लिए उपयोग कर सकते हैं
जवाबों:
जावास्क्रिप्ट संख्याओं का प्रतिनिधित्व करने के लिए IEEE 754 मानक का उपयोग करता है । से विकिपीडिया :
हस्ताक्षरित शून्य एक संबद्ध चिह्न के साथ शून्य है। साधारण अंकगणित में, −0 = +0 = 0. हालांकि, कंप्यूटिंग में, कुछ संख्या प्रतिनिधित्व दो शून्य के अस्तित्व की अनुमति देते हैं, जिन्हें अक्सर (0 (नकारात्मक शून्य) और +0 (सकारात्मक शून्य) द्वारा निरूपित किया जाता है । यह पूर्णांक के लिए कुछ हस्ताक्षरित संख्या प्रतिनिधित्वों में होता है, और अधिकांश अस्थायी बिंदु संख्या प्रतिनिधित्वों में। संख्या 0 को आमतौर पर +0 के रूप में एन्कोड किया जाता है, लेकिन इसे +0 या enc0 द्वारा दर्शाया जा सकता है।
अस्थायी बिंदु अंकगणित के लिए IEEE 754 मानक (वर्तमान में अधिकांश कंप्यूटर और प्रोग्रामिंग भाषा जो फ्लोटिंग पॉइंट संख्या का समर्थन करते हैं) का उपयोग करने के लिए +0 और −0 दोनों की आवश्यकता होती है। शून्य को विस्तारित वास्तविक संख्या रेखा के एक प्रकार के रूप में माना जा सकता है जैसे कि 1 / =0 = −∞ और 1 / + 0 = + be, शून्य से विभाजन केवल / 0 / ± 0 और be / ± be के लिए अपरिभाषित है। ।
लेख में विभिन्न अभ्यावेदन के बारे में अधिक जानकारी है।
यही कारण है कि, तकनीकी रूप से, दोनों शून्य को अलग करना होगा।
हालांकि,
+0 === -0
सच का मूल्यांकन करता है। ऐसा क्यों है (...) ?
यह व्यवहार स्पष्ट रूप से धारा 11.9.6 , सख्त समानता तुलनात्मक एल्गोरिथम (आंशिक रूप से मेरा जोर) में परिभाषित किया गया है :
तुलना
x === y
, जहांx
औरy
मान हैं, सही या गलत पैदा करता है । इस तरह की तुलना इस प्रकार की जाती है:(...)
यदि टाइप (x) संख्या है, तो
- यदि x NaN है, तो गलत लौटें।
- यदि y NaN है, तो गलत लौटें।
- यदि x y के समान संख्या मान है, तो सही लौटें।
- यदि x +0 है और y ,0 है, तो सही लौटें।
- यदि x true0 है और y +0 है, तो सही लौटें।
- विवरण झूठा है।
(...)
(वही जो +0 == -0
btw के लिए रखती है ।)
यह व्यवहारिक रूप से +0
और -0
समान के रूप में लगता है । अन्यथा हमें अपने कोड में इसे ध्यान में रखना होगा और मैं, व्यक्तिगत रूप से, ऐसा नहीं करना चाहता;)
ध्यान दें:
ES2015 एक नई तुलना विधि का परिचय देता है Object.is
। Object.is
स्पष्ट रूप से -0
और के बीच अंतर करता है +0
:
Object.is(-0, +0); // false
1/0 === Infinity; // true
और 1/-0 === -Infinity; // true
।
1 === 1
और +0 === -0
लेकिन 1/+0 !== 1/-0
। कितना अजीब है!
+0 !== -0
;) जो वास्तव में समस्याएं पैदा कर सकता है।
0 !== +0
/ 0 !== -0
, जो वास्तव में समस्याएं भी पैदा करेगा!
मैं इसे एक उत्तर के रूप में जोड़ूंगा क्योंकि मैंने @ user113716 की टिप्पणी को अनदेखा कर दिया था।
आप ऐसा करके -0 का परीक्षण कर सकते हैं:
function isMinusZero(value) {
return 1/value === -Infinity;
}
isMinusZero(0); // false
isMinusZero(-0); // true
e±308
, आपके नंबर का निरूपण केवल निरूपित रूप में किया जा सकता है और अलग-अलग क्रियान्वयन के बारे में अलग-अलग राय है कि उनका समर्थन कहां करना है या नहीं। बिंदु यह है कि, कुछ फ़्लोटिंग पॉइंट मोड्स की कुछ मशीनों पर आपके नंबर का प्रतिनिधित्व किया जाता है -0
और दूसरों के रूप में इसे असमान संख्या के रूप में दर्शाया जाता है 0.000000000000001e-308
। इस तरह की झांकियां, इतना मजेदार
मैं अभी एक उदाहरण भर में आया हूं, जहां +0 और -0 वास्तव में बहुत अलग व्यवहार करते हैं:
Math.atan2(0, 0); //returns 0
Math.atan2(0, -0); //returns Pi
सावधान रहें: यहां तक कि -0.001 जैसे एक नकारात्मक संख्या पर Math.round का उपयोग करते समय, यह वास्तव में -0 होगा और ऊपर दिखाए गए अनुसार कुछ बाद की गणनाओं को खराब कर सकता है।
इसे ठीक करने का त्वरित और गंदा तरीका है:
if (x==0) x=0;
या केवल:
x+=0;
यह -0 होने की स्थिति में संख्या को +0 में परिवर्तित करता है।
में आईईईई 754 मानक जावास्क्रिप्ट में संख्या प्रकार का प्रतिनिधित्व करते थे, संकेत एक सा का प्रतिनिधित्व करती है (एक 1 ऋणात्मक संख्या यह दर्शाती)।
नतीजतन, प्रत्येक प्रतिनिधित्व योग्य संख्या के लिए एक नकारात्मक और एक सकारात्मक मूल्य दोनों मौजूद हैं, जिसमें शामिल हैं 0
।
यही कारण है कि दोनों है -0
और +0
अस्तित्व।
मूल शीर्षक का उत्तर देना Are +0 and -0 the same?
:
brainslugs83
(द्वारा जवाब की टिप्पणियों में Spudley
) ने एक महत्वपूर्ण मामला बताया जिसमें जेएस में +0 और -0 समान नहीं हैं - फ़ंक्शन के रूप में लागू किया गया है:
var sign = function(x) {
return 1 / x === 1 / Math.abs(x);
}
यह, मानक Math.sign
के अलावा +0 और -0 का सही संकेत देता है।
0. के लिए दो संभावित मान (बिट प्रतिनिधित्व) हैं यह अद्वितीय नहीं है। विशेष रूप से फ्लोटिंग पॉइंट संख्या में यह हो सकता है। ऐसा इसलिए है क्योंकि फ्लोटिंग पॉइंट नंबर वास्तव में एक तरह के फॉर्मूले के रूप में संग्रहीत होते हैं।
इंटेगर को अलग-अलग तरीकों से भी संग्रहीत किया जा सकता है। आपके पास अतिरिक्त साइन-बिट के साथ संख्यात्मक मान हो सकता है, इसलिए 16 बिट स्थान में, आप 15 बिट पूर्णांक मान और साइन-बिट संग्रहीत कर सकते हैं। इस प्रतिनिधित्व में, मूल्य 1000 (हेक्स) और 0000 दोनों 0 हैं, लेकिन उनमें से एक +0 है और दूसरा -0 है।
इसे पूर्णांक मान से घटाकर 1 से घटाया जा सकता है, इसलिए यह -1 से -2 ^ 16 तक था, लेकिन यह असुविधाजनक होगा।
एक अधिक सामान्य दृष्टिकोण पूर्णांक को 'दो संकलन' में संग्रहीत करना है, लेकिन जाहिर तौर पर ECMAscript ने नहीं चुना है। इस पद्धति में संख्याएं 0000 से लेकर 7FFF सकारात्मक तक होती हैं। नकारात्मक संख्या FFFF (-1) से 8000 तक शुरू होती है।
बेशक, एक ही नियम बड़े पूर्णांकों पर भी लागू होते हैं, लेकिन मैं नहीं चाहता कि मेरा एफ खराब हो। ;)
+0 === -0
अजीब नहीं लगता। क्योंकि अब हमारे पास 1 === 1
और +0 === -0
लेकिन 1/+0 !== 1/-0
...
+0 === -0
दो बिट प्रतिनिधित्व अलग होने के बावजूद क्यों ।
मैं इसे सख्त समानता तुलना विधि ('===') पर दोष देता हूं। अनुभाग 4d को देखें
विनिर्देश पर 7.2.13 सख्त समानता तुलना देखें
इस घटना को समझाने के लिए विकिपीडिया का एक अच्छा लेख है: http://en.wikipedia.org/wiki/Signed_zero
संक्षेप में, यह +0 और -0 दोनों IEEE फ़्लोटिंग पॉइंट विनिर्देशों में परिभाषित किया गया है। दोनों एक संकेत के बिना 0 से तकनीकी रूप से अलग हैं, जो एक पूर्णांक है, लेकिन व्यवहार में वे सभी शून्य का मूल्यांकन करते हैं, इसलिए सभी व्यावहारिक उद्देश्यों के लिए भेद को अनदेखा किया जा सकता है।