IEEE 754-2008 मानक फ़्लोटिंग-पॉइंट अंकगणित के लिए और ISO / IEC 10967 भाषा स्वतंत्र अंकगणित (LIA) मानक, भाग 1 उत्तर क्यों ऐसा है।
IEEE 754 The 6.3 साइन बिट
जब कोई इनपुट या परिणाम NaN होता है, तो यह मानक NaN के संकेत की व्याख्या नहीं करता है। ध्यान दें, हालांकि, बिट स्ट्रिंग्स पर कार्रवाई - कॉपी, नेगेट, एब्स, कॉपीसिग्न - एक NaN परिणाम के साइन बिट को निर्दिष्ट करते हैं, कभी-कभी एक NaN ऑपरेंड के साइन बिट पर आधारित होता है। तार्किक विधेय कुलऑर्डर एक NaN ऑपरेंड के साइन बिट से भी प्रभावित होता है। अन्य सभी कार्यों के लिए, यह मानक NaN परिणाम के संकेत बिट को निर्दिष्ट नहीं करता है, तब भी जब केवल एक इनपुट NaN हो, या जब NaN अमान्य ऑपरेशन से उत्पन्न होता हो।
जब न तो इनपुट और न ही परिणाम NaN होते हैं, तो किसी उत्पाद या भागफल का संकेत विशेष या ऑपरेंड के संकेत हैं; किसी राशि का अंतर, या अंतर x - y को एक योग x + (ay) के रूप में माना जाता है, जो कि अधिकांश जोड़ के संकेतों में से एक से भिन्न होता है; और रूपांतरणों के परिणाम का संकेत, परिमाणित संचालन, राउंडटॉ-इंटीग्रल ऑपरेशंस, और राउंडटॉइंटरग्लैक्टैक्ट (5.3.1 देखें) पहले या एकमात्र ऑपरेंड का संकेत है। ये नियम तब भी लागू होंगे जब संचालन या परिणाम शून्य या अनंत हों।
जब विपरीत संकेतों वाले दो ऑपरेंड (या संकेतों जैसे दो ऑपरेंड्स का अंतर) बिल्कुल शून्य हो, तो राउंडटाउडरनेटिव को छोड़कर सभी राउंडिंग-दिशा विशेषताओं में उस योग (या अंतर) का चिह्न +0 होगा; उस विशेषता के तहत, एक सटीक शून्य राशि (या अंतर) का चिह्न sign0 होगा। हालाँकि, x + x = x - (xx) x के शून्य होने पर भी उसी चिह्न को x बनाए रखता है।
जोड़ का मामला
डिफ़ॉल्ट राउंडिंग मोड के तहत (राउंड-टू-नेस्ट, टीज़-टू-इवन) , हम देखते हैं कि x+0.0
उत्पादन करता है x
, EXCEPT कब x
है -0.0
: उस स्थिति में हमारे पास विपरीत संकेतों वाले दो ऑपरेंड का योग है जिसका योग शून्य है, और .36- पैरा इसके अतिरिक्त 3 नियम उत्पन्न होते हैं +0.0
।
चूंकि मूल के समान बिटवाइज़+0.0
नहीं है , और यह एक वैध मूल्य है जो इनपुट के रूप में हो सकता है, संकलक को कोड में डालने के लिए बाध्य किया जाता है जो संभावित नकारात्मक शून्य को बदल देगा ।-0.0
-0.0
+0.0
सारांश: डिफ़ॉल्ट गोलाई मोड के तहत, में x+0.0
, अगरx
- नहीं है
-0.0
, तो x
अपने आप में एक स्वीकार्य आउटपुट वैल्यू है।
- है
-0.0
, तो आउटपुट वैल्यू होना चाहिए +0.0
, जो बिटवाइज़ के समान नहीं है -0.0
।
गुणन का मामला
डिफ़ॉल्ट राउंडिंग मोड के तहत , ऐसी कोई समस्या नहीं होती है x*1.0
। यदि x
:
घटाव का मामला
डिफ़ॉल्ट राउंडिंग मोड के तहत , घटाव x-0.0
भी एक नो-ऑप है, क्योंकि यह इसके बराबर है x + (-0.0)
। अगर x
है
- है
NaN
, तो ,6.3p1 और then6.2.3 इसके अलावा और गुणा के लिए एक ही तरीके से लागू होते हैं।
- है
+/- infinity
, तो परिणाम +/- infinity
उसी संकेत का है।
- एक (उप) सामान्य संख्या है,
x-0.0 == x
हमेशा।
- है
-0.0
, तो p6.3p2 से हमारे पास " [...] एक राशि का चिह्न है, या एक अंतर x - y को एक योग x + ()y) के रूप में माना जाता है, जो कि अधिकांश जोड़ियों के संकेतों में से एक से भिन्न होता है; "। यह हमें -0.0
परिणाम के रूप में असाइन करने के लिए मजबूर करता है (-0.0) + (-0.0)
, क्योंकि इस खंड के उल्लंघन में, जोड़ में -0.0
से किसी एक से साइन में भिन्नता नहीं है, जबकि दो में +0.0
से अलग से साइन इन करता है ।
- इसके
+0.0
बाद, यह द केस ऑफ एडिशन(+0.0) + (-0.0)
में ऊपर विचार किए गए अतिरिक्त मामले को कम करता है , जिसे this6.3p3 द्वारा देने का फैसला किया जाता है ।+0.0
चूंकि सभी मामलों के लिए इनपुट मूल्य आउटपुट के रूप में कानूनी है, इसलिए इसे x-0.0
नो-ऑप और x == x-0.0
एक टॉटोलॉजी पर विचार करने की अनुमति है।
मूल्य-परिवर्तन अनुकूलन
IEEE 754-2008 स्टैंडर्ड में निम्नलिखित दिलचस्प उद्धरण हैं:
IEEE 754 4 10.4 शाब्दिक अर्थ और मूल्य-परिवर्तन अनुकूलन
[...]
निम्नलिखित मूल्य-परिवर्तन परिवर्तन, दूसरों के बीच, स्रोत कोड के शाब्दिक अर्थ को संरक्षित करते हैं:
- पहचान गुण 0 + x को लागू करना जब x शून्य नहीं है और एक संकेतन NaN नहीं है और परिणाम में x के समान घातांक है।
- पहचान गुण 1 × x को लागू करना जब x संकेतन NaN नहीं है और परिणाम में x के समान प्रतिपादक है।
- एक शांत NaN का पेलोड या साइन बिट बदलना।
- [...]
सभी Nans और सभी infinities ही प्रतिपादक, और की सही ढंग से गोल परिणाम का हिस्सा के बाद से x+0.0
और x*1.0
परिमित के लिए x
ठीक उसी परिमाण के रूप में है x
, उनके प्रतिपादक एक ही है।
sNaNs
सिग्नलिंग NaN फ़्लोटिंग-पॉइंट ट्रैप मान हैं; वे विशेष NaN मान हैं, जिनका उपयोग फ़्लोटिंग-पॉइंट ऑपरेंड के रूप में एक अमान्य ऑपरेशन अपवाद (SIGFPE) के रूप में होता है। यदि एक लूप जो एक अपवाद को ट्रिगर करता है, तो उसे ऑप्टिमाइज़ किया गया था, सॉफ़्टवेयर अब समान व्यवहार नहीं करेगा।
हालांकि, जैसा कि user2357112 टिप्पणियों में बताते हैं , C11 मानक स्पष्ट रूप से NaNs ( sNaN
) को संकेत देने के व्यवहार को अपरिभाषित करता है , इसलिए संकलक को यह मानने की अनुमति है कि वे घटित नहीं होते हैं, और इस प्रकार जो अपवाद हैं वे भी घटित नहीं होते हैं। C ++ 11 मानक NaNs को इंगित करने के लिए एक व्यवहार का वर्णन करते हुए छोड़ देता है, और इस तरह इसे अपरिभाषित भी छोड़ देता है।
राउंडिंग मोड्स
वैकल्पिक राउंडिंग मोड में, अनुमेय अनुकूलन बदल सकते हैं। उदाहरण के लिए, राउंड-नेगेटिव-इन्फिनिटी मोड के तहत , अनुकूलन x+0.0 -> x
अनुमेय हो जाता है, लेकिन x-0.0 -> x
निषिद्ध हो जाता है।
जीसीसी को डिफ़ॉल्ट राउंडिंग मोड और व्यवहार को संभालने से रोकने के लिए, प्रयोगात्मक ध्वज -frounding-math
को जीसीसी को पारित किया जा सकता है।
निष्कर्ष
Clang और GCC , यहां तक कि -O3
IEEE-754 के अनुरूप है। इसका मतलब यह IEEE-754 मानक के उपरोक्त नियमों के अनुसार होना चाहिए। x+0.0
है थोड़ा-समान नहीं करने के लिए x
सभी के लिए x
उन नियमों के तहत है, लेकिन x*1.0
ऐसा हो चुना जा सकता है : जब हम, अर्थात्
x
जब यह एक NaN है , तो पेलोड को अपरिवर्तित पारित करने की सिफारिश का पालन करें ।
- एक NaN परिणाम के संकेत बिट को अपरिवर्तित छोड़ दें
* 1.0
।
- किसी भागफल / उत्पाद के दौरान साइन बिट को XOR करने के आदेश का पालन करें, जब
x
वह NaN नहीं है।
IEEE-754-असुरक्षित अनुकूलन को सक्षम करने के लिए (x+0.0) -> x
, ध्वज -ffast-math
को Clang या GCC को पास करने की आवश्यकता होती है।