इसका वास्तव में पाइथन से कोई लेना देना नहीं है - आप अपने हार्डवेयर के बाइनरी फ़्लोटिंग-पॉइंट अंकगणित का उपयोग करके किसी भी भाषा में वही व्यवहार देखेंगे। पहले read the docs।
पढ़ने के बाद, आप बेहतर समझेंगे कि आप नहीं हैं जो आपके कोड में एक सौवां जोड़ते हैं।
>>> from decimal import Decimal
>>> Decimal(.01)
Decimal('0.01000000000000000020816681711721685132943093776702880859375')
कि स्ट्रिंग द्विआधारी चल ("डबल परिशुद्धता" सी में) की सटीक दशमलव मान से पता चलता सन्निकटन सटीक दशमलव मान 0.01 करने के लिए: यह आप वास्तव में क्या जोड़ रहे है। जो चीज आप वास्तव में जोड़ रहे हैं वह 1/100 से थोड़ा बड़ा है।
फ़्लोटिंग-पॉइंट न्यूमेरिक त्रुटियों को नियंत्रित करना "संख्यात्मक विश्लेषण" नामक फ़ील्ड है, और यह एक बहुत बड़ा और जटिल विषय है। जब तक आप इस तथ्य से चौंक जाते हैं कि फ्लोट दशमलव मानों के अनुमान हैं, decimal
मॉड्यूल का उपयोग करें। यह आपके लिए "उथले" समस्याओं की दुनिया ले जाएगा।
from decimal import Decimal as D
def sqrt(num):
root = D(0)
while root * root < num:
root += D("0.01")
return root
तो: उदाहरण के लिए, अपने कार्य को यह छोटा सा संशोधन दिए गए
>>> sqrt(4)
Decimal('2.00')
>>> sqrt(9)
Decimal('3.00')
यह वास्तव में अधिक नहीं सही है, लेकिन क्योंकि अब यह बिल्कुल एक के बाद एक जोड़ने है सरल उदाहरण में कम चौंकाने वाली हो सकती -hundredth। प्रपत्र I/2**J
के मूल्यों:
एक वैकल्पिक तैरता और कुछ है कि वास्तव में एक द्विआधारी नाव के रूप में प्रदर्शनीय है जोड़ने के लिए रहना है। उदाहरण के लिए, 0.01 जोड़ने के बजाय, 0.125 (1/8) या 0.0625 (1/16) जोड़ें।
फिर कंप्यूटिंग वर्ग जड़ों ;-) [दशमलव] (http://docs.python.org/2/library/decimal.html) मॉड्यूल
स्रोत
2013-10-20 04:18:20
शायद कोशिश के लिए "न्यूटन की विधि" देखो, जो है परिशुद्धता के लिए डिजाइन किया गया है? – Michael0x2a