2014-06-29 5 views
6

को स्विफ्ट प्रोग्रामिंग भाषा अनुसार:स्विफ्ट हेक्साडेसिमल फ़्लोटिंग पॉइंट मानों के एक्सपोनेंट के लिए बेस 2 का उपयोग क्यों करता है?

उदाहरण के लिए, 0xFp2 15 ⨉ 2^2 का प्रतिनिधित्व करता है, जो 60 इसी तरह करने के लिए मूल्यांकन करता है, 0xFp2 का प्रतिनिधित्व करता है 15 ⨉ 2^(- 2), जो 3.75 का मूल्यांकन करता है।

2 के बजाय एक्सपोनेंट के लिए आधार के रूप में 2 का उपयोग क्यों किया जाता है? मैं 0xFp2 == 15 * (2**2)

उत्तर

10

स्विफ्ट का हेक्साडेसिमल नोटेशन के बजाय 0xFp2 == 15 * (16**2) उम्मीद करता हूँ फ्लोटिंग प्वाइंट संख्या के लिए सिर्फ दोनों इनपुट और आउटपुट के लिए notation introduced for C in the C99 standard (printf %a प्रारूप के साथ) की एक विविधता है।

उस नोटेशन का उद्देश्य मनुष्यों द्वारा व्याख्या करना आसान है और IEEE 754 representation के बिट्स को कुछ हद तक पहचानने योग्य होना चाहिए। आईईईई 754 प्रतिनिधित्व आधार दो का उपयोग करता है। नतीजतन, एक सामान्य फ्लोटिंग प्वाइंट नंबर, p से पहले नंबर 1 और 2 के बीच है जब के लिए, p के बाद संख्या सीधे आईईईई 754 प्रतिनिधित्व के प्रतिपादक फ़ील्ड का मान है। इस बिट प्रतिनिधित्व करने के लिए मानव पठनीयता और निकटता की दोहरी उद्देश्यों के अनुरूप है:

$ cat t.c 
#include <stdio.h> 

int main(){ 
    printf("%a\n", 3.14); 
} 
$ gcc t.c && ./a.out 
0x1.91eb851eb851fp+1 

संख्या 0x1.91eb851eb851fp+1 क्योंकि प्रतिपादक 1 है और significand 0x1.9 के पास है, थोड़ा 3 से थोड़ा ऊपर होने के लिए देखा जा सकता है 0x1.8 से ऊपर, जो दो की दो शक्तियों के बीच सटीक मध्य इंगित करता है।

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

हेक्साडेसिमल p से पहले संख्या के लिए उपयोग किया जाता है, जो आईईईई 754 प्रारूप में महत्व के अनुरूप है, क्योंकि यह बाइनरी से अधिक कॉम्पैक्ट है। आईईईई 754 बाइनरी 64 नंबर के महत्व के लिए 0x1. के बाद 13 हेक्साडेसिमल अंकों की आवश्यकता होती है, जो कि बहुत कुछ है, लेकिन बाइनरी 52 अंकों की आवश्यकता होगी, जो स्पष्ट रूप से अव्यवहारिक है।

हेक्साडेसिमल की पसंद में वास्तव में इसकी कमी है: इस विकल्प के कारण, समान संख्या के लिए कई समकक्ष प्रतिनिधित्व हमेशा समकक्ष के रूप में पहचानना आसान नहीं होते हैं। उदाहरण के लिए, 0x1.3p1 और 0x2.6p0 समान संख्या का प्रतिनिधित्व करते हैं, हालांकि उनके अंकों में कुछ भी सामान्य नहीं है। बाइनरी में, दो नोटेशन 0b1.0011p1 और 0b10.011p0 के अनुरूप होंगे, जो समकक्ष के रूप में देखना आसान होगा। एक और उदाहरण लेने के लिए, 3.14 को 0xc.8f5c28f5c28f8p-2 के रूप में भी प्रदर्शित किया जा सकता है, जो 0x1.91eb851eb851fp+1 के समान संख्या के रूप में देखना बेहद मुश्किल है। यदि p के बाद नंबर 16 के एक शक्ति का प्रतिनिधित्व किया यह समस्या मौजूद नहीं होता, आप अपने प्रश्न में सुझाव है, लेकिन प्रतिनिधित्व के Unicity एक उद्देश्य जब C99 मानकीकृत था नहीं था: आईईईई 754 प्रतिनिधित्व करने के लिए निकटता थी।

+0

यह कहना है कि किसी विशेष प्रकार के हर फ्लोटिंग प्वाइंट नंबर, उस रूप में एक अनूठा विहित प्रतिनिधित्व होता है, तो एक के लिए +/- शून्य विशेष अभ्यावेदन निर्दिष्ट करने के लिए थे, और नहीं तो यह है कि प्रमुख अंकों होना आवश्यक उचित होगा एक '1' और निर्दिष्ट अंकों की संख्या" भरने "के लिए पर्याप्त हो सकती है? – supercat

+0

@supercat कंपाइलर आउटपुट इस तरह के फैशन में सामान्यीकृत है (मेरे संकलन प्लेटफ़ॉर्म पर, 80-बिट 'लंबे डबल' को छोड़कर, इस प्रकार मैंने 3.14 के लिए वैकल्पिक रूप प्राप्त किया)। इनपुट दिशा में सभी प्रकारों को अनुमति देने के लिए इसके फायदे हैं, उदाहरण के लिए पूर्णांक (0x7fffffff.0p0) और तालिका प्रविष्टियों के लिए (जैसे http://stackoverflow.com/a/23726810/139746) –

+0

यह निश्चित रूप से स्वीकार करने के लिए एक कंपाइलर के लिए उपयोगी है गैर-वैधानिक प्रतिनिधित्व, विशेष रूप से ऐसी परिस्थितियों में जहां एक ही पी * के लिए फॉर्म एम/2^पी * के कई मान होते हैं। पाप (एक्स) के आउटपुट में निरंतर * सार्थक * गतिशील रेंज है जो 0 से 1 तक फैली हुई है, भले ही एक्स पीआई के पास है; denormalized रूप में मूल्य दिखाते हुए उनके सापेक्ष महत्व उन्हें सामान्यीकृत रूप में दिखाने से कहीं अधिक स्पष्ट बनाता है। – supercat

संबंधित मुद्दे