पायथन में डबल सटीक फ्लोटिंग मान? [बन्द है]


84

क्या फ्लोट की तुलना में बेहतर परिशुद्धता के साथ डेटा प्रकार हैं?


3
यह वास्तव में अलग-अलग उत्तरों के साथ दो प्रश्न हैं। 1: अजगर में डबल सटीक मान फ्लोट हैं, और 2: फ्लोट से बेहतर सटीक डेटा प्रकार दशमलव होगा। क्या इस तरह के प्रश्न किसी तरह विभाजित हो सकते हैं? स्वीकृत उत्तर # 2 पते पर है, लेकिन अधिकांश उत्कीर्ण उत्तर पते # 1।
bsplosion

जवाबों:


53

दशमी तिथि

  • हार्डवेयर आधारित बाइनरी फ़्लोटिंग पॉइंट के विपरीत, दशमलव मॉड्यूल में उपयोगकर्ता परिवर्तनशील सटीक (28 स्थानों पर डिफ़ॉल्ट) होता है जो किसी दिए गए समस्या के लिए जितना बड़ा हो सकता है।

यदि आपको प्रदर्शन issuses द्वारा दबाया जाता है, तो GMPY पर एक नज़र डालें


यदि मैं मूल प्रश्न पूछ रहा था, तो @ लार्समैन का उत्तर होगा (भले ही औपचारिक रूप से यह ऑफ-टॉपिक हो)।
पियोट फाइंडसेन

@PiotrFindeisen वह जवाब कहां है?
कृपया हेल्प

कोई विचार नहीं है, लेकिन अब मैं @FredFoo का संदर्भ लूंगा। आम तौर पर "पायथन में डबल सटीक फ्लोटिंग मान?" → " float-s हैं डबल परिशुद्धता"
पिओर Findeisen

120

पायथन के अंतर्निहित floatप्रकार में दोहरी सटीकता है (यह doubleसीपीयथॉन में एक सी , जाइथन में एक जावा doubleहै)। यदि आपको अधिक सटीकता की आवश्यकता है, तो NumPy प्राप्त करें और इसका उपयोग करें numpy.float128


15
जाहिर है, numpy.float128अक्सर 64 बिट सिस्टम पर 64 बिट परिशुद्धता होती है। numpy.float128(1) + numpy.float128(2**-64) - numpy.float128(1)लौटता है 0.0। देखें stackoverflow.com/a/29821557/420755
जेफ

0.1 + 0.2 अजगर में सटीक 0.3 नहीं है, हर दूसरी भाषा में यह एक फ्लोट समस्या है लेकिन कभी भी दोहरी समस्या नहीं है। क्यों यह अजगर में सटीक 0.3 नहीं है?
फुस्का सॉफ्टवेयर

@FuscaSoftware अन्य भाषाओं में भी यह एक समस्या है। IEEE डबल्स ठीक 0.3 का प्रतिनिधित्व नहीं कर सकता है। यह एक स्वरूपण कलाकृति की तरह लगता है।
हंस मुसग्रेव

17

कुछ अनुप्रयोगों के लिए आप Fractionफ़्लोटिंग-पॉइंट नंबरों के बजाय उपयोग कर सकते हैं ।

>>> from fractions import Fraction
>>> Fraction(1, 3**54)
Fraction(1, 58149737003040059690390169)

(अन्य अनुप्रयोगों के लिए, decimalअन्य प्रतिक्रियाओं के अनुसार सुझाव दिया गया है।)


1
मैं दशमलव और अंश के बीच कैसे चुनूं? अंश बेहतर लगता है क्योंकि यह निरंतर अंशों का प्रतिनिधित्व कर सकता है जो मुझे लगता है कि दशमलव नहीं कर सकता है?
Janus Troelsen

1
@ जानूस: अपनी आवश्यकताओं पर विचार करें, और जो उन्हें बेहतर लगे उसे चुनें। का प्रयोग करें Decimalजब आप अनुमानित संख्या है कि तय कर दी है (लेकिन विन्यास) परिशुद्धता के साथ काम करना चाहते हैं। Fractionजब आप सटीक अनुपात के साथ काम करना चाहते हैं, तब उपयोग करें और अपनी अनबाउंड स्टोरेज आवश्यकताओं के साथ तैयार करने के लिए तैयार रहें।
गारेथ रीस

क्या फ़्रेक्शन उन सभी ऑपरेशनों का समर्थन करता है जो आप फ्लोट के साथ कर सकते हैं?
दनिजर


1

यहाँ मेरा समाधान है। मैं पहले random.uniform के साथ यादृच्छिक संख्या बनाता हूं, उन्हें डबल परिशुद्धता के साथ स्ट्रिंग में स्वरूपित करता हूं और फिर उन्हें वापस फ्लोट में परिवर्तित करता हूं। आप '.2f' को '.3f' आदि में बदलकर सटीकता को समायोजित कर सकते हैं।

import random
from decimal import Decimal

GndSpeedHigh = float(format(Decimal(random.uniform(5, 25)), '.2f'))
GndSpeedLow = float(format(Decimal(random.uniform(2, GndSpeedHigh)), '.2f'))
GndSpeedMean = float(Decimal(format(GndSpeedHigh + GndSpeedLow) / 2, '.2f')))
print(GndSpeedMean)

1
कुंआ। डबल परिशुद्धता का अर्थ है फ्लोट के द्विआधारी प्रतिनिधित्व की तुलना में चर की दोहरी लंबाई द्विआधारी प्रतिनिधित्व। दो दशमलव स्थानों पर नहीं।
क्रिविमिर

तुम सही हो। हो सकता है कि मैंने ख़राब खोज मापदंड का उपयोग किया हो, जब मुझे स्वयं यह समस्या थी और यह परिणाम है। कुछ अन्य लोग इसी मुद्दे को खोज सकते हैं जैसे मैंने किया था और अंत में यहाँ। उम्मीद है कि उन्हें कुछ राहत मिले। :)
बिट्टिकेटु ६

यह सबसे खराब तरीका है जो मैं दो दशमलव स्थानों पर एक फ्लोट को गोल करने के लिए सोच सकता हूं। आपको numpy.floor(100*a)/100किसी संख्या aको दो दशमलव स्थानों तक कम करने के लिए उपयोग करना चाहिए ।
वुज़ल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.