क्या 16331239353195370.0 का विशेष महत्व है?


89

का उपयोग करते हुए import numpy as npमैंने देखा है कि

np.tan(np.pi/2)

शीर्षक में संख्या देता है और नहीं np.inf

16331239353195370.0

मैं इस नंबर को लेकर उत्सुक हूं। क्या यह कुछ सिस्टम मशीन सटीक पैरामीटर से संबंधित है? क्या मैं किसी चीज़ से इसकी गणना कर सकता था? (मैं कुछ इसी तरह की लाइनों के साथ सोच रहा हूं sys.float_info)

संपादित करें: जावा, ऑक्टेस, मैटलैब जैसे अन्य वातावरणों में एक ही परिणाम वास्तव में प्रतिलिपि प्रस्तुत करने योग्य है ... सुझाए गए डुप्लिकेट व्याख्या नहीं करते हैं, हालांकि।



10
मुझे वह जवाब पसंद नहीं है - यह पूरी तरह से हाथ से लहराता है, वास्तव में इसका कारण नहीं है। "रेडियन में टैन (पीआई / 2) अनिवार्य रूप से अनंत है, है ना?" क्यों के बारे में कुछ भी स्पष्ट नहीं करता है - जैसा कि ओपी ने यहां पूछा - जवाब वास्तव में नहीं है np.inf। लेकिन यह स्पष्ट नहीं है कि न केवल यह समझाएं कि यह क्यों नहीं है, बल्कि यह भी समझाने के लिए कि उत्तर वास्तव में वही क्यों देखा गया है - और इसलिए मैंने किया ;-)
टिम पीटर्स

जवाबों:


119

piपायथन फ्लोट (प्लेटफॉर्म सी के doubleप्रकार के समान) के रूप में बिल्कुल प्रतिनिधित्व योग्य नहीं है । निकटतम प्रतिनिधित्व योग्य सन्निकटन का उपयोग किया जाता है।

यहाँ मेरे बॉक्स पर उपयोग में सटीक सन्निकटन है (शायद आपके बॉक्स पर भी ऐसा ही हो):

>>> import math
>>> (math.pi / 2).as_integer_ratio()
(884279719003555, 562949953421312)

उस अनुपात की स्पर्शरेखा को खोजने के लिए, मैं अब wxMaxima पर स्विच करने जा रहा हूं:

(%i1) fpprec: 32;
(%o1) 32
(%i2) tan(bfloat(884279719003555) / 562949953421312);
(%o2) 1.6331239353195369755967737041529b16

इतना अनिवार्य रूप से आप क्या मिला के समान है। pi/2प्रयुक्त बाइनरी सन्निकटन गणितीय ("अनंत परिशुद्धता") के मूल्य से थोड़ा कम है pi/2। तो आपको इसके बजाय एक बहुत बड़ी स्पर्शरेखा मिलती है infinity। गणना tan()वास्तविक इनपुट के लिए उपयुक्त है!

ठीक उसी प्रकार के कारणों के लिए, जैसे,

>>> math.sin(math.pi)
1.2246467991473532e-16

0. वापस नहीं करता है। अनुमान math.piसे थोड़ा सा कम है pi, और प्रदर्शित परिणाम सही है कि सत्य दिया गया है।

गणित के अन्य तरीके

उपयोग में सटीक अनुमान देखने के कई तरीके हैं:

>>> import math
>>> math.pi.as_integer_ratio()
(884279719003555, 281474976710656)

math.pi उस अनुपात के गणितीय ("अनंत परिशुद्धता") मूल्य के बराबर है।

या हेक्स अंकन में एक सटीक फ्लोट के रूप में:

>>> math.pi.hex()
'0x1.921fb54442d18p+1'

या एक तरह से सबसे आसानी से सभी के बारे में आसानी से समझ में आता है:

>>> import decimal
>>> decimal.Decimal(math.pi)
Decimal('3.141592653589793115997963468544185161590576171875')

हालांकि यह तुरंत स्पष्ट नहीं हो सकता है, प्रत्येक परिमित बाइनरी फ्लोट बिल्कुल परिमित दशमलव फ्लोट के रूप में प्रतिनिधित्व करने योग्य है (रिवर्स सच नहीं है; जैसे दशमलव 0.1एक परिमित बाइनरी फ्लोट के रूप में बिल्कुल प्रतिनिधित्व योग्य नहीं है), और Decimal(some_float)निर्माता सटीक समकक्ष पैदा करता है।

यहां piसटीक दशमलव मान का अनुसरण किया गया है math.pi, और तीसरी पंक्ति पर एक कैरेट पहले अंक की ओर इशारा करता है जहां वे भिन्न हैं:

true    3.14159265358979323846264338327950288419716939937510...
math.pi 3.141592653589793115997963468544185161590576171875
                         ^

math.piअब "लगभग सभी" बॉक्स में समान है, क्योंकि लगभग सभी बॉक्स अब एक ही बाइनरी फ्लोटिंग-पॉइंट प्रारूप (IEEE 754 डबल परिशुद्धता) का उपयोग करते हैं। आप ऊपर दिए गए किसी भी तरीके का उपयोग इस बात की पुष्टि करने के लिए कर सकते हैं कि आपके बॉक्स में, या उपयोग में सटीक अनुमान लगाने के लिए कि क्या आपका बॉक्स अपवाद है।


@ टिम पीटर्स - यह पूरी तरह से स्पष्ट है। पूर्णता के लिए मैं अनुमान लगा रहा हूं कि यह np.piप्रणाली के एप्सिलॉन के भीतर सबसे निकटतम तर्कसंगत प्रतिनिधित्व है?
अग्युल जुएल

3
मान np.piलिया गया है कि पायथन के रूप में एक ही मूल्य है math.pi(मैंने जांच नहीं की थी, लेकिन आप ;-)), यह प्लेटफ़ॉर्म के मूल C doubleफ़्लोटिंग-पॉइंट प्रारूप में गणितीय पाई प्रतिनिधित्व के लिए निकटतम मूल्य है । जिसका अर्थ है IEEE 754 अब लगभग सभी बॉक्सों पर डबल-सटीक है, और इसलिए (mantissa) परिशुद्धता के 53 बिट्स के साथ निकटतम बाइनरी फ्लोट है। अतः परिमेय का समुच्चय उस रूप में विवश +/- I * 2**Jहोता Iहै जहाँ पूर्णांक 0 या होता है 2**52 <= I < 2**53, और पूर्णांक की सीमा इस Jतरह से व्यापक होती है कि वह इस रूप के सभी परिमेय को कहीं भी समाहित कर सके pi
टिम पीटर्स

2
और यही कारण है कि मैं चाहता हूँ प्यार करता है, तो "बाइनरी" त्रिकोणमितीय कार्यों और अधिक सामान्यतः लागू किया गया। चूंकि पीआई को तर्कसंगत रूप से कभी भी प्रस्तुत नहीं किया जा सकता है, यह 0 से 1. कोण तक चलने वाले कार्यों के एक सेट के साथ काम करेगा
पाइप

खैर, उन्होंने आयात किया np.pi, नहीं math.pi
इकोन्स

2
@ Έρικ Κωνσταντόπουλος math.pi, np.piहै, और scipy.piसभी एक ही कर रहे हैं; वे सिर्फ नामकरण की सुविधा के लिए डुप्लिकेट हैं; stackoverflow.com/questions/12645547/…
टिम पीटर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.