मैं IEEE-754 समिति का सदस्य था, मैं चीजों को थोड़ा स्पष्ट करने में मदद करने की कोशिश करूँगा।
सबसे पहले, फ़्लोटिंग-पॉइंट नंबर वास्तविक संख्या नहीं हैं, और फ़्लोटिंग-पॉइंट अंकगणित वास्तविक अंकगणित के स्वयंसिद्धों को संतुष्ट नहीं करता है। ट्रायकोटॉमी वास्तविक अंकगणित की एकमात्र संपत्ति नहीं है जो न तो तैरने के लिए रखती है, न ही सबसे महत्वपूर्ण। उदाहरण के लिए:
- जोड़ साहचर्य नहीं है।
- वितरण कानून धारण नहीं करता है।
- बिना व्युत्क्रम के फ्लोटिंग-पॉइंट नंबर हैं।
मैं जा सकता था। एक निश्चित आकार के अंकगणितीय प्रकार को निर्दिष्ट करना संभव नहीं है जो वास्तविक अंकगणित के सभी गुणों को संतुष्ट करता है जिसे हम जानते हैं और प्यार करते हैं। 754 समिति को उनमें से कुछ को मोड़ने या तोड़ने का फैसला करना है। यह कुछ बहुत ही सरल सिद्धांतों द्वारा निर्देशित है:
- जब हम कर सकते हैं, हम वास्तविक अंकगणित के व्यवहार से मेल खाते हैं।
- जब हम नहीं कर सकते, तो हम उल्लंघन का अनुमान लगाने और जितना संभव हो उतना आसान निदान करने की कोशिश करते हैं।
आपकी टिप्पणी के बारे में "इसका मतलब यह नहीं है कि सही उत्तर गलत है", यह गलत है। विधेय (y < x)
पूछता है कि क्या y
इससे कम है x
। यदि y
NaN है, तो यह किसी भी फ्लोटिंग-पॉइंट वैल्यू से कम नहीं हैx
, इसलिए उत्तर आवश्यक रूप से गलत है।
मैंने उल्लेख किया कि ट्रिकोटॉमी फ्लोटिंग-पॉइंट वैल्यू के लिए नहीं है। हालांकि, एक समान संपत्ति है जो धारण करती है। क्लाज 5.11, 754-2008 मानक के पैरा 2:
चार परस्पर अनन्य संबंध संभव हैं: से कम, बराबर, अधिक से अधिक, और अव्यवस्थित। आखिरी मामला तब उठता है जब कम से कम एक ऑपरेंड NaN होता है। प्रत्येक NaN अपने आप सहित हर चीज के साथ अनियंत्रित की तुलना करेगा।
जहां तक NaNs को संभालने के लिए अतिरिक्त कोड लिखने का सवाल है, तो आमतौर पर यह संभव है (हालांकि हमेशा आसान नहीं होता) अपने कोड को इस तरह से स्ट्रक्चर करना कि NaN ठीक से गिर जाए, लेकिन यह हमेशा ऐसा नहीं होता है। जब ऐसा नहीं होता है, तो कुछ अतिरिक्त कोड आवश्यक हो सकते हैं, लेकिन यह सुविधा के लिए भुगतान करने के लिए एक छोटी सी कीमत है जो बीजीय बंद करने के लिए फ्लोटिंग-पॉइंट अंकगणित में लाया गया है।
परिशिष्ट: कई टिप्पणीकारों ने तर्क दिया है कि यह NaN को अपनाने वाले आधार पर समानता और त्रिकोटॉमी की संवेदनशीलता को बनाए रखने के लिए अधिक उपयोगी होगा! = NaN किसी भी परिचित स्वयंसिद्ध को संरक्षित करने के लिए प्रतीत नहीं होता है। मैं इस दृष्टिकोण के लिए कुछ सहानुभूति रखने का स्वीकार करता हूं, इसलिए मैंने सोचा कि मैं इस उत्तर पर फिर से विचार करूंगा और थोड़ा और संदर्भ प्रदान करूंगा।
कहन से बात करने में मेरी समझ यह है कि NaN! = NaN की उत्पत्ति दो व्यावहारिक विचारों से हुई है:
यही कारण है कि x == y
के बराबर होना चाहिए x - y == 0
जब भी संभव हो (असली गणित के प्रमेय होने के बजाए, इस तुलना अधिक स्थान कुशल, समय मानक विकसित किया गया था पर अत्यंत महत्व का था जिसमें से हार्डवेयर कार्यान्वयन बनाता है - टिप्पणी, तथापि, कि इस एक्स के लिए उल्लंघन किया जाता है = y = अनन्तता, इसलिए यह अपने आप में एक महान कारण नहीं है; यह यथोचित रूप से तुला हो सकता है (x - y == 0) or (x and y are both NaN)
)।
इससे भी महत्वपूर्ण बात isnan( )
यह है कि उस समय कोई विधेय नहीं था जो 8087 अंकगणित में NaN को औपचारिक रूप दिया गया था; प्रोग्रामर को NaN मानों का पता लगाने का एक सुविधाजनक और कुशल साधन प्रदान करना आवश्यक था isnan( )
जो प्रोग्रामिंग भाषाओं पर निर्भर नहीं था जो कुछ वर्षों तक प्रदान कर सकता था। मैं कहन के विषय पर खुद के लेखन का उद्धरण दूंगा:
वहाँ NaNs से छुटकारा पाने के लिए कोई रास्ता नहीं था, वे CRAYs पर Indefinites के रूप में बेकार हो जाएगा; जैसे ही एक का सामना किया गया, एक अनिश्चित समय के लिए अनिश्चित काल के लिए जारी रखने के बजाय गणना को सबसे अच्छा बंद कर दिया जाएगा। यही कारण है कि NaN पर कुछ संचालन गैर-NaN परिणाम देने चाहिए। कौन सा ऑपरेशन? ... अपवाद C "x == x" और "x! = X" की भविष्यवाणी करते हैं, जो क्रमशः प्रत्येक अनंत या परिमित संख्या x के लिए 1 और 0 हैं, लेकिन यदि x संख्या नहीं है (NaN) तो रिवर्स करें; ये NaN और उन भाषाओं में संख्याओं के बीच एकमात्र सरल अविशिष्ट भेद प्रदान करते हैं जिनमें NaN के लिए एक शब्द का अभाव होता है और IsNaN (x) का अनुमान लगाते हैं।
ध्यान दें कि यह भी तर्क है कि "नॉट-ए-बुलियन" की तरह कुछ वापस करने के नियम हैं। हो सकता है कि यह व्यावहारिकता गलत थी, और मानक की आवश्यकता होनी चाहिए थी isnan( )
, लेकिन इससे NaN को कई वर्षों तक कुशलतापूर्वक और आसानी से उपयोग करना असंभव हो गया, जबकि दुनिया प्रोग्रामिंग भाषा को अपनाने के लिए इंतजार कर रही थी। मुझे यकीन नहीं है कि यह एक उचित व्यापार होगा।
कुंद होना: NaN == NaN का परिणाम अब बदलने वाला नहीं है। इंटरनेट पर शिकायत करने की तुलना में इसके साथ रहना बेहतर है। यदि आप यह तर्क देना चाहते हैं कि कंटेनरों के लिए उपयुक्त ऑर्डर रिलेशन भी मौजूद होना चाहिए , तो मैं यह सलाह देने की सलाह दूंगा कि आपकी पसंदीदा प्रोग्रामिंग भाषा totalOrder
IEEE-754 (2008) में मानकीकृत विधेय को लागू करें । तथ्य यह है कि यह पहले से ही कहन की चिंता की वैधता पर बात नहीं करता है जिसने वर्तमान स्थिति को प्रेरित किया है।
while (fabs(x - oldX) > threshold)
, लूप से बाहर निकलना अगर अभिसरण होता है या एक NaN गणना में प्रवेश करता है। NaN का पता लगाना और उपयुक्त उपाय करना तब लूप के बाहर होता है।