2011-02-09 12 views
5

this प्रश्न से संबंधित है, संख्या स्वरूपण के साथ वास्तव में क्या हो रहा है?गणित आंतरिक संख्या प्रारूप और परिशुद्धता

In[3] := InputForm @ 3.12987*10.^-16 
Out[3] := 3.12987`*^-16 

In[4] := InputForm @ 3.12987*10.^-17 
Out[4] := 3.1298700000000004`*^-17 

जबकि *^, संक्रमण लेता है थोड़ा आगे यद्यपि यह मशीन परिशुद्धता कि शुरू होता है:

In[1] := InputForm @ 3.12987*10^-270 
Out[1] := 3.12987`*^-270 

In[2] := InputForm @ 3.12987*10^-271 
Out[2] := 3.1298700000000003`*^-271 

आप गुणक के रूप में *10.^ का उपयोग करते हैं संक्रमण जहां भोलेपन से यह होने की अपेक्षा करेंगे है बाहर flaking:

In[5] := InputForm @ 3.12987*^-308 
Out[5] := 3.12987`*^-308 

In[6] := InputForm @ 3.12987*10.^-309 
Out[6] := 3.12987`15.954589770191008*^-309 

आधार शुरू होता है कुछ समय बाद

को तोड़ने
In[7] := InputForm @ 3.12987*^-595 
Out[7] := 3.12987`15.954589770191005*^-595 

In[8] := InputForm @ 3.12987*^-596 
Out[8] := 3.1298699999999999999999999999999999999999`15.954589770191005*^-596 

मुझे लगता है कि ये संक्रमण इस प्रारूप से संबंधित हैं जिसमें मैथमैटिका आंतरिक रूप से इसकी संख्या रखती है, लेकिन क्या कोई जानता है, या किसी शिक्षित अनुमान को खतरे में डाल सकता है, कैसे?

उत्तर

8

यदि मैं सही ढंग से समझता हूं तो आप सोच रहे होंगे कि इनपुटफॉर्म 6 अंकों से अधिक दिखाएगा। यदि ऐसा है, तो यह आश्चर्यजनक रूप से होता है, जब भी मूल्यांकन के बाद प्राप्त किए गए नंबर का "सर्वश्रेष्ठ" प्रतिनिधित्व करने के लिए अधिक अंक की आवश्यकता होती है। चूंकि मूल्यांकन में 10^(कुछ शक्ति) द्वारा स्पष्ट गुणा शामिल है, और चूंकि दशमलव इनपुट की आवश्यकता नहीं है (और इस मामले में नहीं) बाइनरी में बिल्कुल प्रतिनिधित्व करने योग्य है, तो आप जो अपेक्षा करते हैं उससे छोटे अंतर प्राप्त कर सकते हैं।

In[26]:= Table[3.12987*10^-j, {j, 10, 25}] // InputForm 

Out[26]//InputForm= 
{3.12987*^-10, 
3.12987*^-11, 
3.12987*^-12, 
3.12987*^-13, 
3.12987*^-14, 
3.12987*^-15, 
3.12987*^-16, 
3.1298700000000004*^-17, 
3.1298700000000002*^-18, 
3.12987*^-19, 
3.12987*^-20, 
3.1298699999999995*^-21, 
3.1298700000000003*^-22, 
3.1298700000000004*^-23, 
3.1298700000000002*^-24, 
3.1298699999999995*^-25} 

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

जब आप मशीन फ़्लोटिंग पॉइंट नंबर की सीमाओं को पार करते हैं, तो आपको एक मनमाना सटीक एनालॉग मिलता है। यह मशीन मशीन नहीं है लेकिन वास्तव में $ मशीनप्रिजन है (यह मैथमैटिका में मशीन फ्लोट्स के लिए बिग्नम एनालॉग है)।

3.12987 *^- 5 9 6 (9 0 के साथ समाप्त होने वाला दशमलव) के लिए इनपुटफॉर्म में आप जो देखते हैं, मेरा मानना ​​है कि मैथमैटिका के आंतरिक प्रतिनिधित्व में गार्ड बिट्स के उपयोग शामिल हैं। एक मशीन डबल के समान, केवल 53 मंथिसा बिट्स थे, तो निकटतम दशमलव प्रतिनिधित्व अपेक्षित छह अंक होंगे।

`haphazardly` का उपयोग करते समय सॉफ्टवेयर व्यवहार का वर्णन के लिए

डैनियल Lichtblau Wolfram अनुसंधान

+0

+1। –

+0

अंतर्दृष्टि के लिए धन्यवाद। मनमाने ढंग से परिशुद्धता के संक्रमण ने मुझे हमेशा भ्रमित कर दिया है, खासकर जब मुझे फ़ाइल में बड़ी मात्रा में डेटा लिखना पड़ता है और अचानक प्रत्येक संख्या में सटीक डेटा के 16 वर्ण जोड़े जाते हैं! – Timo

+0

@ टिमो 16 अक्षर अत्यधिक लगता है। क्या आपका मतलब है कि आपको जो संख्या मिलती है वह मशीन की तुलना में लगभग 16 बाइट बड़ी होती है? या आप उस छोटी सी घटना को देखते हैं? यदि प्रश्न संख्याएं वास्तव में मशीन युगल की आकार सीमा के भीतर हैं तो मुझे पोस्ट करने या मुझे एक उदाहरण भेजने के लिए स्वतंत्र महसूस करें, क्योंकि यह आपके कोड में या गणित के पुट या निर्यात में किसी भी समस्या का संकेत दे सकता है, जो भी आप उपयोग कर रहे हैं। –

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