2010-06-15 19 views
5

मैंने फ्लोटिंग पॉइंट के बारे में यहां पर अधिकांश पोस्ट पढ़ी हैं, और मैं बुनियादी अंतर्निहित मुद्दे को समझता हूं जो आईईईई 754 (और बाइनरी में संख्याओं को संग्रहित करने की प्रकृति द्वारा) का उपयोग करके कुछ अंशों का प्रतिनिधित्व नहीं किया जा सकता है। मैं निम्नलिखित यह पता लगाने की कोशिश कर रहा हूँ: दोनों अजगर और जावास्क्रिप्ट आईईईई 754 मानक का उपयोग करते हैं, क्यों यह है कि क्रियान्वित .20000000000000001 मेंएक अन्य फ़्लोटिंग पॉइंट प्रश्न

.1 + .1

परिणाम अजगर में निम्नलिखित (जो करने के लिए है उम्मीद की जा)

कहाँ के रूप में जावास्क्रिप्ट में (कम से कम Chrome और Firefox) में जवाब .2

हालांकि प्रदर्शन है

.1 + .2

0,30000000000000004

इसके अलावा में दोनों भाषाओं परिणामों में, को क्रियान्वित करने वर एक = 0.3; जावास्क्रिप्ट में और 0.3

में एक परिणाम मुद्रण कहाँ के रूप में 0,29999999999999999

में अजगर परिणामों में एक = 0.3 कर मैं व्यवहार में इस अंतर का कारण समझ में करना चाहते हैं।

इसके अतिरिक्त, ओएस पर कई पोस्ट जावा के बिगडिसीमल के जावास्क्रिप्ट पोर्ट से लिंक हैं, लेकिन लिंक मर चुका है। क्या किसी की एक प्रति है?

उत्तर

6

0,29999999999999999

में काफी नहीं एक = 0.3 अजगर परिणामों में कर रही:

>>> a = 0.3 
>>> print a 
0.3 
>>> a 
0.29999999999999999 

जैसा कि आप देख, प्रिंट ing a0.3 दिखाता है - क्योंकि एक अभिव्यक्ति टाइप करते समय डिफ़ॉल्ट रूप से print राउंड से 6 या 7 दशमलव अंक (यहां a एक एकल-चर है अभिव्यक्ति) प्रॉम्प्ट पर परिणाम को दो गुना से अधिक अंकों के साथ दिखाता है (इस प्रकार फ्लोटिंग पॉइंट की आंतरिक सीमाओं को प्रकट करता है)।

जावास्क्रिप्ट में संख्याओं को प्रदर्शित करने के तरीके के बारे में थोड़ा अलग नियम हो सकते हैं, और राउंडिंग के सटीक विवरण आपके द्वारा देखे गए मतभेदों को समझाने के लिए पर्याप्त हैं। नोट, उदाहरण के लिए (क्रोम जावास्क्रिप्ट कंसोल पर):

> (1 + .1) * 1000000000 
    1100000000 
> (1 + .1) * 100000000000000 
    110000000000000.02 

देखें? यदि आप अधिक अंक देखने के लिए प्रबंधन करते हैं, तो विसंगतियां (जो अनिवार्य रूप से हैं) भी दिखाई देती हैं।

+0

हमेशा के रूप में, एक स्पष्ट जवाब! –

+0

धन्यवाद! इससे इसे साफ़ करने में मदद मिलती है। – jeffmax

+0

मैंने अभी तक यह कोशिश नहीं की है, लेकिन जावास्क्रिप्ट बिगडिसीमल क्लास का नया लिंक http://stz-ida.de/index.php?option=com_content&view=article&id=18:bigdecimal-unterstuetzung-fuer-javascript&catid=4 है: सॉफ्टवेयर और Itemid = 32 – jeffmax

0

मैं व्यवहार में इस अंतर के कारण को समझना चाहता हूं।

  1. वे अलग-अलग भाषाओं कर रहे हैं।

  2. वे विभिन्न अंतर्निहित पैकेज का उपयोग करते हैं।

  3. उनके पास विभिन्न कार्यान्वयन हैं।

जब आप "पायथन" कहते हैं - आप किस कार्यान्वयन के बारे में बात कर रहे हैं? सी, ज्योथन, आयरनपीथन? क्या आप उनमें से प्रत्येक की तुलना करते थे?

जावास्क्रिप्ट लोग पाइथन लोगों को बार-बार द्विआधारी क्रियाओं को दोहराने के तरीके से अलग-अलग बाइनरी भिन्नताओं को दोहराने लगते हैं।

कभी-कभी जावास्क्रिप्ट अंत में त्रुटि बिट्स को चुपचाप दबा देता है। कभी-कभी ऐसा नहीं होता है।

यही कारण है।

आपके पास दोनों के लिए स्रोत कोड है। यदि आप और जानना चाहते हैं, तो आप कर सकते हैं। हालांकि, स्रोत कोड को जानना ज्यादा नहीं बदलता है।

3

और मुद्रण।

दोनों के पास एक ही आईईईई 754 अंतर्निहित प्रतिनिधित्व हो सकता है, लेकिन इसका मतलब यह नहीं है कि उन्हें उसी तरह प्रिंट करने के लिए मजबूर होना पड़ता है।ऐसा लगता है कि जब अंतर काफी छोटा होता है तो जावास्क्रिप्ट आउटपुट को गोल कर रहा है।

फ़्लोटिंग पॉइंट नंबरों के साथ, महत्वपूर्ण हिस्सा यह है कि बाइनरी डेटा कैसे संरचित किया जाता है, न कि यह स्क्रीन पर क्या दिखाता है। घड़ी -

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