ruby - रूबी में हमारे पास 0.0 और-0.0 क्यों हैं?




floating-point negative-zero (3)

इस सवाल का पहले से ही यहाँ एक जवाब है:

रूबी में मैं 0.0 फ्लोट को नकारात्मक संकेत क्यों दे सकता हूं, क्या यह सुविधा किसी भी तरह से उपयोगी है? क्या कोई मुझे यह समझा सकता है?

-0.0
#=> -0.0

-0.0 * -1
#=> 0.0

ऐसा इसलिए है क्योंकि सभी IEEE 754 फ़्लोटिंग पॉइंट नंबरों में यह संकेत करने के लिए एक बिट होता है कि कोई नंबर पॉजिटिव है या नेगेटिव।

यहाँ 2.5 और -2.5 के द्विआधारी निरूपण हैं:

[2.5].pack('f').unpack1('b*')
#=> "00000000000000000000010000000010"

[-2.5].pack('f').unpack1('b*')
#=> "00000000000000000000010000000011"

अंतिम बिट साइन बिट है, ध्यान दें कि अन्य सभी बिट समान हैं।

दूसरी ओर, साइन बिट के साथ शून्य 0 सेट है:

['00000000000000000000000000000000'].pack('b*').unpack1('f')
#=> 0.0

और साइन बिट 1 साथ शून्य शून्य:

['00000000000000000000000000000001'].pack('b*').unpack1('f')
#=> -0.0

यद्यपि 0.0 और -0.0 संख्यात्मक रूप से समान हैं, वे वस्तु स्तर पर समान नहीं हैं:

(0.0).eql?(-0.0)   #=> true
(0.0).equal?(-0.0) #=> false

नकारात्मक शून्य के साथ काम करते समय कुछ विशेष गुण होते हैं, जैसे:

1 / 0.0    #=> Infinity
1 / -0.0   #=> -Infinity

असाइन करना - स्पष्ट रूप से -0.0 प्राप्त करने का एकमात्र तरीका नहीं है। आप इसे मूल अंकगणितीय ऑपरेशन के परिणाम के रूप में भी प्राप्त कर सकते हैं:

-1.0 * 0 #=> -0.0

गणितीय परिचालनों के वास्तविक संख्या परिणाम होते हैं, लेकिन हम उन वास्तविक परिणामों को निकटतम फ़्लोटिंग-पॉइंट संख्या पर मैप करते हैं, जिसे "गोलाई" कहा जाता है। प्रत्येक फ्लोटिंग-पॉइंट संख्या के लिए, वास्तविक संख्या की एक सीमा होती है, जो उस फ़्लोट के लिए गोल होती है, और कभी-कभी फ़्लोट के बारे में यह सोचना उपयोगी होता है कि उस वास्तविक संख्या की सीमा के साथ पहचान की जाए।

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

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


यह रूबी की विशेषता नहीं है, बल्कि फ्लोटिंग पॉइंट नंबर विनिर्देशन का हिस्सा है। इस जवाब को देखें। ऋणात्मक शून्य समान धनात्मक शून्य है:

-0.0 == 0.0
# => true




negative-zero