असामान्य संख्या

From Vigyanwiki
असंवर्धित फ़्लोटिंग-पॉइंट प्रणाली में केवल सामान्यीकृत संख्याएँ होंगी (लाल रंग में संकेतित)। असामान्य संख्या (नीला) की अनुमति देने से प्रणाली की सीमा बढ़ जाती है।

कंप्यूटर विज्ञान में, उप-सामान्य संख्या असामान्य संख्याओं (कभी-कभी डिनॉर्मल्स कहा जाता है) का सबसेट है जो फ्लोटिंग-पॉइंट अंकगणितीय में शून्य के आसपास अंकगणितीय अंतर्प्रवाह अंतर को भरती है। सबसे छोटी सामान्य संख्या से छोटे परिमाण वाली कोई भी गैर-शून्य संख्या असामान्य है।

उपयोग नोट: कुछ पुराने दस्तावेज़ों में (विशेष रूप से आईईईई 754-1985 और C भाषा के प्रारंभिक रिलीज़ जैसे मानक दस्तावेज़ों में), विशेष रूप से असामान्य संख्याओं को संदर्भित करने के लिए डीनॉर्मल का उपयोग किया जाता है। यह उपयोग विभिन्न मानकों के दस्तावेजों में बना रहता है, विशेष रूप से हार्डवेयर पर चर्चा करते समय जो किसी भी अन्य असामान्य संख्या का प्रतिनिधित्व करने में असमर्थ है, लेकिन यहां चर्चा आईईईई 754-2008 के 2008 के संशोधन के अनुरूप असामान्य शब्द का उपयोग करती है।

सामान्य फ़्लोटिंग-पॉइंट मान में, महत्व (मंटिसा) में कोई अग्रणी शून्य नहीं है; किंतु, घातांक को समायोजित करके अग्रणी शून्य हटा दिए जाते हैं (उदाहरण के लिए, संख्या 0.0123 को 1.23 × 10−2 के रूप में लिखा जाएगा)। इसके विपरीत, असामान्य फ़्लोटिंग पॉइंट मान का शून्य के अग्रणी अंक के साथ महत्व होता है। इनमें से, असामान्य संख्याएं उन मूल्यों का प्रतिनिधित्व करती हैं जो सामान्यीकृत होने पर सबसे छोटे प्रतिनिधित्व योग्य प्रतिपादक (सीमित सीमा वाले प्रतिपादक) के नीचे प्रतिपादक होंगे।

आईईईई फ़्लोटिंग-पॉइंट संख्या का महत्व (या मंटिसा) फ़्लोटिंग-पॉइंट संख्या का हिस्सा है जो महत्वपूर्ण आंकड़ों का प्रतिनिधित्व करता है। सकारात्मक सामान्यीकृत संख्या के लिए इसे गैर-शून्य m0 के साथ m0.m1m2m3...mp−2mp−1 (जहां m महत्वपूर्ण अंक का प्रतिनिधित्व करता है, और p स्पष्ट है) के रूप में प्रदर्शित किया जा सकता है। ध्यान दें कि बाइनरी मूलांक के लिए, अग्रणी बाइनरी अंक सदैव 1 होता है। असामान्य संख्या में, चूंकि घातांक सबसे कम है जो यह हो सकता है, शून्य प्रमुख महत्वपूर्ण अंक (0.m1m2m3...mp−2mp−1) है, जो सबसे छोटी सामान्य संख्या की तुलना में शून्य के निकट संख्याओं का प्रतिनिधित्व करने की अनुमति देता है। फ्लोटिंग-पॉइंट नंबर को असामान्य के रूप में पहचाना जा सकता है जब भी इसका प्रतिपादक कम से कम संभव हो।

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

आईईईई 754-2008 में, असामान्य संख्याओं का नाम बदल कर असामान्य संख्याएँ कर दी जाती हैं और इन्हें बाइनरी और दशमलव दोनों स्वरूपों में समर्थित किया जाता है। बाइनरी आदान-प्रदान प्रारूपों में, असामान्य संख्याएं 0 के पक्षपाती प्रतिपादक पूर्वाग्रह के साथ एन्कोड की जाती हैं, लेकिन सबसे छोटे अनुमत प्रतिपादक के मान के साथ व्याख्या की जाती है, जो कि बड़ा (अर्थात, जैसे कि इसे 1 के रूप में एन्कोड किया गया था) है। दशमलव आदान-प्रदान प्रारूपों में उन्हें किसी विशेष एन्कोडिंग की आवश्यकता नहीं होती है क्योंकि प्रारूप सीधे असामान्य संख्याओं का समर्थन करता है।

गणितीय रूप से बोलते हुए, किसी दिए गए चिह्न के सामान्यीकृत फ़्लोटिंग-पॉइंट संख्याओं को मोटे तौर पर लॉगरिदमिक रूप से स्थान दिया जाता है, और इस तरह के किसी भी परिमित आकार के सामान्य फ़्लोट में शून्य सम्मिलित नहीं हो सकता है। असामान्य फ़्लोट्स मूल्यों का रैखिक रूप से फैला हुआ सेट है, जो नकारात्मक और सकारात्मक सामान्य फ़्लोट्स के बीच के अंतर को फैलाता है।


पृष्ठभूमि

असामान्य संख्याएं गारंटी प्रदान करती हैं कि फ़्लोटिंग-पॉइंट संख्याओं का जोड़ और घटाव कभी भी कम नहीं होता है; पास के दो फ़्लोटिंग-पॉइंट संख्याओं में सदैव प्रतिनिधित्व योग्य गैर-शून्य अंतर होता है। क्रमिक अंतर्प्रवाह के बिना, घटाव ab अंतर्प्रवाहित हो सकता है और शून्य उत्पन्न कर सकता है, तथापि मान समान न हों। बदले में, यह शून्य त्रुटियों से विभाजन की ओर ले जा सकता है जो तब नहीं हो सकता जब क्रमिक अंतर्प्रवाह का उपयोग किया जाता है।

इंटेल 8087 में असामान्य संख्या प्रयुक्त किए गए थे जबकि आईईईई 754 स्टैंडर्ड लिखा जा रहा था। वे के-सी-एस प्रारूप प्रस्ताव में अब तक की सबसे विवादास्पद विशेषता थी जिसे अंततः अपनाया गया था,[1] लेकिन इस कार्यान्वयन ने प्रदर्शित किया कि व्यावहारिक कार्यान्वयन में असामान्य संख्याओं का समर्थन किया जा सकता है। फ्लोटिंग-पॉइंट इकाइयों के कुछ कार्यान्वयन सीधे हार्डवेयर में असामान्य संख्या का समर्थन नहीं करते हैं, किंतु किसी प्रकार के सॉफ़्टवेयर समर्थन के लिए फंस जाते हैं। चूंकि यह उपयोगकर्ता के लिए पारदर्शी हो सकता है, लेकिन इसका परिणाम उन गणनाओं में हो सकता है जो असामान्य संख्याओं का उत्पादन या उपभोग करती हैं जो सामान्य संख्याओं पर समान गणनाओं की तुलना में बहुत धीमी होती हैं।

प्रदर्शन के उद्देश्य

कुछ प्रणालियाँ हार्डवेयर में असामान्य मानों को सामान्य मानों की तरह संभालती हैं। अन्य लोग प्रणाली सॉफ़्टवेयर ("सहायता") के लिए असामान्य मानों को संभालने के लिए छोड़ देते हैं, केवल सामान्य मान और हार्डवेयर में शून्य संभालते हैं। सॉफ्टवेयर में असामान्य मूल्यों को संभालने से सदैव प्रदर्शन में महत्वपूर्ण कमी आती है। जब हार्डवेयर में उपसामान्य मूल्यों की पूरी तरह से गणना की जाती है, तो सामान्य संख्याओं की तुलना में गति पर उनके प्रसंस्करण की अनुमति देने के लिए कार्यान्वयन विधियाँ उपस्थित होती हैं।[2] चूँकि, कई आधुनिक x86 प्रोसेसर पर गणना की गति काफी कम रहती है; अत्यधिक स्थितियों में, असामान्य ऑपरेंड से जुड़े निर्देशों में 100 से अधिक अतिरिक्त घड़ी चक्र लग सकते हैं, जिससे सबसे तेज़ निर्देश छह गुना धीमी गति से चलने लगते हैं।[3][4]

यह गति अंतर, सुरक्षा संकट हो सकता है। शोधकर्ताओं ने दिखाया कि यह टाइमिंग साइड चैनल प्रदान करता है जो दुर्भावनापूर्ण वेब साइट को वेब ब्राउज़र के अंदर दूसरी साइट से पृष्ठ सामग्री निकालने की अनुमति देता है।[5]

कुछ अनुप्रयोगों में असामान्य संख्या से बचने के लिए, या तो स्पष्टता बनाए रखने के लिए, या कुछ प्रोसेसर में प्रदर्शन दंड से बचने के लिए कोड सम्मिलित करने की आवश्यकता होती है। उदाहरण के लिए, ऑडियो प्रसंस्करण अनुप्रयोगों में, असामान्य मान सामान्यतः संकेत का इतना शांत प्रतिनिधित्व करते हैं कि यह मानव श्रवण सीमा से बाहर है। इस कारण से, प्रोसेसर पर असामान्य से बचने के लिए सामान्य उपाय जहां प्रदर्शन जुर्माना होगा, एक बार जब यह असामान्य स्तर पर पहुंच जाता है या अत्यंत शांत शोर संकेत में मिश्रण होता है, तो संकेत को शून्य पर काट दिया जाता है।[6] असामान्य संख्याओं को रोकने के अन्य विधियों में डीसी ऑफ़सेट जोड़ना, संख्याओं को परिमाणित करना, निक्विस्ट संकेत जोड़ना आदि सम्मिलित हैं।[7] एसएसई2 प्रोसेसर एक्सटेंशन के बाद से, इंटेल ने सीपीयू हार्डवेयर में ऐसी कार्यक्षमता प्रदान की है, जो उपसामान्य संख्याओं को शून्य तक ले जाती है।[8]



कोड स्तर पर असामान्य फ़्लोट्स को अक्षम करना

इंटेल एसएसई

इंटेल के C और फोरट्रान कंपाइलर --O0 से अधिक अनुकूलन स्तर के लिए डिफ़ॉल्ट रूप से एसएसई के लिए DAZ (डीनॉर्मल्स-एरे-ज़ीरो) और FTZ (फ्लश-टू-ज़ीरो) फ़्लैग को सक्षम करते हैं।[9] DAZ का प्रभाव फ्लोटिंग-पॉइंट ऑपरेशंस के लिए असामान्य इनपुट तर्कों को शून्य के रूप में मानना है, और FTZ का प्रभाव ऑपरेशंस के लिए असामान्य फ्लोट के बजाय शून्य वापस करना है, जिसके परिणामस्वरूप असामान्य फ्लोट होगा, तथापि इनपुट तर्क स्वयं न हों। क्लैंग और जीसीसी में प्लेटफ़ॉर्म और अनुकूलन स्तर के आधार पर अलग-अलग डिफ़ॉल्ट अवस्थाएँ होती हैं।

एसएसई का समर्थन करने वाले लक्ष्यों पर DAZ और FTZ झंडे को सक्षम करने की गैर-C99-अनुपालन विधि नीचे दी गई है, लेकिन व्यापक रूप से समर्थित नहीं है। यह कम से कम 2006 से मैक ओएस एक्स पर काम करने के लिए जाना जाता है।[10]

#include <fenv.h>
#pragma STDC FENV_ACCESS ON
// Sets DAZ and FTZ, clobbering other CSR settings.
// See https://opensource.apple.com/source/Libm/Libm-287.1/Source/Intel/, fenv.c and fenv.h. 
fesetenv(FE_DFL_DISABLE_SSE_DENORMS_ENV); 
// fesetenv(FE_DFL_ENV) // Disable both, clobbering other CSR settings.

अन्य x86-SSE प्लेटफ़ॉर्म के लिए जहाँ C लाइब्रेरी ने अभी तक इस फ़्लैग को प्रयुक्त नहीं किया है, निम्नलिखित कार्य कर सकते हैं:[11]

#include <xmmintrin.h>
_mm_setcsr(_mm_getcsr() | 0x0040);  // DAZ
_mm_setcsr(_mm_getcsr() | 0x8000);  // FTZ
_mm_setcsr(_mm_getcsr() | 0x8040);  // Both
_mm_setcsr(_mm_getcsr() & ~0x8040); // Disable both

_MM_SET_DENORMALS_ZERO_MODE और _MM_SET_FLUSH_ZERO_MODE उपरोक्त कोड के लिए मैक्रोज़ अधिक पठनीय इंटरफ़ेस लपेटते हैं।[12]

// To enable DAZ
#include <pmmintrin.h>
_MM_SET_DENORMALS_ZERO_MODE(_MM_DENORMALS_ZERO_ON);
// To enable FTZ
#include <xmmintrin.h>
_MM_SET_FLUSH_ZERO_MODE(_MM_FLUSH_ZERO_ON);

अधिकांश कंपाइलर पहले से ही डिफ़ॉल्ट रूप से पिछला मैक्रो प्रदान करेंगे, अन्यथा निम्न कोड स्निपेट का उपयोग किया जा सकता है (एफटीजेड की परिभाषा समान है):

#define _MM_DENORMALS_ZERO_MASK   0x0040
#define _MM_DENORMALS_ZERO_ON     0x0040
#define _MM_DENORMALS_ZERO_OFF    0x0000

#define _MM_SET_DENORMALS_ZERO_MODE(mode) _mm_setcsr((_mm_getcsr() & ~_MM_DENORMALS_ZERO_MASK) | (mode))
#define _MM_GET_DENORMALS_ZERO_MODE()                (_mm_getcsr() &  _MM_DENORMALS_ZERO_MASK)

एप्लिकेशन_बाइनरी_इंटरफेस द्वारा डिफॉल्ट डीनॉर्मलाइजेशन व्यवहार अनिवार्य है, और इसलिए अच्छी तरह से व्यवहार किए गए सॉफ़्टवेयर को कॉल करने वाले या अन्य पुस्तकालयों में कोड को वापस करने से पहले डीनॉर्मलाइज़ेशन मोड को सहेजना और पुनर्स्थापित करना चाहिए।

एआरएम

आर्च32 नियॉन (एसआईएमडी) एफपीयू सदैव फ्लश-टू-जीरो मोड का उपयोग करता है, जो FTZ + DAZ के समान है। स्केलर एफपीयू और आर्च64 एसआईएमडी के लिए, फ्लश-टू-ज़ीरो व्यवहार वैकल्पिक है और आर्च64 में एफपीएससीआर और आर्च64 में एफपीएससीआर के नियंत्रण रजिस्टर के FZ बिट द्वारा नियंत्रित किया जाता है।

कुछ एआरएम प्रोसेसर में असामान्य्स की हार्डवेयर हैंडलिंग होती है।

यह भी देखें

संदर्भ

  1. "An Interview with the Old Man of Floating-Point". University of California, Berkeley.
  2. Schwarz, E.M.; Schmookler, M.; Son Dao Trong (July 2005). "FPU Implementations with Denormalized Numbers" (PDF). IEEE Transactions on Computers. 54 (7): 825–836. doi:10.1109/TC.2005.118. S2CID 26470540.
  3. Dooley, Isaac; Kale, Laxmikant (2006-09-12). "Quantifying the Interference Caused by Subnormal Floating-Point Values" (PDF). Retrieved 2010-11-30.
  4. Fog, Agner. "Instruction tables: Lists of instruction latencies, throughputs and microoperation breakdowns for Intel, AMD and VIA CPUs" (PDF). Retrieved 2011-01-25.
  5. Andrysco, Marc; Kohlbrenner, David; Mowery, Keaton; Jhala, Ranjit; Lerner, Sorin; Shacham, Hovav. "On Subnormal Floating Point and Abnormal Timing" (PDF). Retrieved 2015-10-05.
  6. Serris, John (2002-04-16). "Pentium 4 denormalization: CPU spikes in audio applications". Archived from the original on February 25, 2012. Retrieved 2015-04-29.
  7. de Soras, Laurent (2005-04-19). "Denormal numbers in floating point signal processing applications" (PDF).
  8. Casey, Shawn (2008-10-16). "x87 and SSE Floating Point Assists in IA-32: Flush-To-Zero (FTZ) and Denormals-Are-Zero (DAZ)". Retrieved 2010-09-03.
  9. "Intel® MPI Library – Documentation". Intel.
  10. "Re: Macbook pro performance issue". Apple Inc. Archived from the original on 2016-08-26.
  11. "Re: Changing floating point state (Was: double vs float performance)". Apple Inc. Archived from the original on 2014-01-15. Retrieved 2013-01-24.
  12. "C++ Compiler for Linux* Systems User's Guide". Intel.


अग्रिम पठन

  • See also various papers on William Kahan's web site [1] for examples of where subnormal numbers help improve the results of calculations.