मुझे लगता अंतर एक 64-बिट एक और तो एक एक लंबे करने के लिए रूपांतरण के लिए एक लंबे एक 80-बिट चल बिन्दु मान से एक रूपांतरण बनाम करने के लिए एक 80-बिट चल बिन्दु मान से एक रूपांतरण है।
(80 बिट बिल्कुल भी आने के लिए कारण यह है कि कि एक विशिष्ट वास्तविक अंकगणित के लिए इस्तेमाल किया सटीक, और चल बिन्दु रजिस्टरों की चौड़ाई है।)
मान लीजिए 80-बिट परिणाम 10.999999999999999 की तरह कुछ है - कि से एक लंबी पैदावार से 10 हालांकि करने के लिए रूपांतरण, 80-बिट मूल्य के सबसे नजदीक 64-बिट चल बिन्दु मूल्य वास्तव में 11.0 है, इसलिए दो चरणों रूपांतरण उपज 11.
संपादित समाप्त होता है: यह एक देने के लिए थोड़ा अधिक वजन ...
यहां एक जावा प्रोग्राम है जो सैम करने के लिए मनमाना-परिशुद्धता अंकगणित का उपयोग करता है ई गणना। ध्यान दें कि यह डबल मान को 0.1 से एक बिगडिसीमल में परिवर्तित करता है - यह मान 0.1000000000000000055511151231257827021181583404541015625 है। (दूसरे शब्दों में, गणना की सटीक परिणाम नहीं 11 वैसे भी है।)
import java.math.*;
public class Test
{
public static void main(String[] args)
{
BigDecimal c = new BigDecimal(0.1d);
BigDecimal a = new BigDecimal(1d);
BigDecimal b = new BigDecimal(2d);
BigDecimal result = b.subtract(a)
.add(c)
.divide(c, 40, RoundingMode.FLOOR);
System.out.println(result);
}
}
यहाँ परिणाम है:
10.9999999999999994448884876874217606030632
दूसरे शब्दों में, यह सही बारे में 40 दशमलव अंक के लिए (रास्ता है 64 या 80 बिट फ्लोटिंग पॉइंट से अधिक संभाल सकता है)।
अब, मान लीजिए कि यह संख्या बाइनरी में कैसा दिखती है। मेरे पास आसानी से रूपांतरण करने के लिए कोई उपकरण नहीं है, लेकिन फिर हम जावा का उपयोग करने के लिए उपयोग कर सकते हैं। एक सामान्यीकृत संख्या मान लिया जाये कि, "10" भाग तीन बिट्स (एक ग्यारह = 1011 के लिए कम से कम) का उपयोग कर समाप्त होता है। इससे विस्तारित परिशुद्धता (80 बिट्स) और 48 बिट्स डबल परिशुद्धता (64 बिट्स) के लिए मंटिसा के 60 बिट छोड़ देता है।
तो, प्रत्येक परिशुद्धता में 11 के लिए निकटतम संख्या क्या है?
import java.math.*;
public class Test
{
public static void main(String[] args)
{
BigDecimal half = new BigDecimal("0.5");
BigDecimal eleven = new BigDecimal(11);
System.out.println(eleven.subtract(half.pow(60)));
System.out.println(eleven.subtract(half.pow(48)));
}
}
परिणाम::
10.999999999999999999132638262011596452794037759304046630859375
10.999999999999996447286321199499070644378662109375
तो, तीन नंबर हम मिल गया है कर रहे हैं:
Correct value: 10.999999999999999444888487687421760603063...
11-2^(-60): 10.999999999999999999132638262011596452794037759304046630859375
11-2^(-48): 10.999999999999996447286321199499070644378662109375
अब सही के लिए निकटतम मूल्य बाहर काम फिर से, के जावा का उपयोग करते हैं प्रत्येक परिशुद्धता के लिए - विस्तारित परिशुद्धता के लिए, यह 11 से कम है। उन मानों में से प्रत्येक को लंबे समय तक गोल करें, और आप क्रमश: 10 और 11 के साथ समाप्त होते हैं।
उम्मीद है कि यह पर्याप्त सबूत संदेह करने वालों को समझाने के लिए है;)
वे मेरे सिस्टम पर समान (दोनों 11) हैं? –
आप इसे किस साथ संकलित कर रहे हैं? – Joseph
बस मज़े के लिए, एक स्थानीय चर बनाने की कोशिश करें और देखें कि क्या चीजें बदलती हैं। –