Thursday, 15 August 2013

language agnostic - Is floating point math broken? -


  0.1 + 0.2 == 0.3 - & gt; झूठा  
  0.1 + 0.2 - & gt; 0.30000000000000004  

ऐसा क्यों होता है?

बाइनरी गणित की तरह है इस। अधिकांश प्रोग्रामिंग भाषाओं में, यह पर आधारित है। जावास्क्रिप्ट 64-बिट फ्लोटिंग प्वाइंट प्रस्तुति का उपयोग करता है, जो जावा के डबल के समान है समस्या की जड़ यह है कि संख्याएं इस स्वरूप में एक पूर्ण संख्या के रूप में दो की शक्ति का प्रतिनिधित्व करती हैं; तर्कसंगत संख्याएं (जैसे 0.1 , जो कि 1/10 है) जिसका दोरार्य दो की शक्ति नहीं है, वह बिल्कुल प्रतिनिधित्व नहीं किया जा सकता।

मानक binary64 स्वरूप में, प्रतिनिधित्व ठीक तरह से लिखा जा सकता है

  • 0.1000000000000000055511151231257827021181583404541015625 दशमलव में, या
  • 0x1.999999999999ap-4 इन।

इसके विपरीत, तर्कसंगत संख्या 0.1 , जो कि 1/10 , जैसा कि

  • 0.1 दशमलव में, या
  • 0x1.99999999999999 के रूप में लिखा जा सकता है .. .पी -4 सी -1 99 हेक्सफ्लोट नोटेशन के एक एनालॉग में, जहां ... 9 के एक अंतहीन अनुक्रम का प्रतिनिधित्व करता है।

स्थिरांक 0.2 और 0.3 अपने कार्यक्रम में भी उनके सच्चे मूल्यों के अनुमानों का अनुमान लगाया जाएगा। ऐसा होता है कि निकटतम डबल से 0.2 तर्कसंगत संख्या 0.2 से बड़ा होता है, लेकिन यह निकटतम डबल से < कोड> 0.3 तर्कसंगत संख्या 0.3 से छोटा है। 0.1 और 0.2 का योग तर्कसंगत संख्या 0.3 से बड़ा है और इसलिए आपके कोड में निरंतर से असहमति।

अस्थायी बिंदु अंकगणित मुद्दों का एक काफी व्यापक उपचार है एक आसान-से-पचाने की व्याख्या के लिए, देखें।


No comments:

Post a Comment