2013-10-17 16 views
7

के बीच भाव में डबल अगर मैं है निम्नलिखित अभिव्यक्ति:अंतर्निहित रूपांतरण/नाव को बढ़ावा देने या सी # और जावा

byte A = 69; 
int B = 123; 
long C =; 
float D = 4.9f; 
double E = 11.11; 

double X = (B * 100) + 338.1 - (E/B)/C; 
double X1 = (B * 100) + (A * D) - (E/B)/C; 

// JAVA - lost precision 
System.out.println(X); // 12638.099971861307 
System.out.println(X1); // 12638.099581236307 

// C# - almost the same 
Console.WriteLine(X); // 12638.0999718613 
Console.WriteLine(X1) // 12638.0999784417 

मैंने देखा है कि जावा एक्स से परिशुद्धता जहां 338.1 निहित डबल जबकि सी # लगभग नहीं है खो देता है । मुझे समझ में नहीं आता क्यों 338.1 फ्लोट और डबल में बराबर है। डॉट के बाद केवल एक अंक है।

+1

338.1 फ्लोट और डबल में समान नहीं है। 338.1 दोहराता की सटीक द्विआधारी विस्तार हमेशा के लिए है, इसलिए जब एक डबल के रूप में व्यक्त है, यह जब नाव के रूप में व्यक्त की तुलना में और भी बहुत कुछ गैर शून्य अंक हैं। –

+1

कृपया http://csharpindepth.com/Articles/General/FloatingPoint.aspx पढ़ें – Rohit

उत्तर

1

जावा में, (B * 100) + (A * D) एक फ्लोट होगा; और यह फ्लोट होगा जो 12638.1 के करीब है। हालांकि, 12638 को प्रारंभिक 1 सहित बाइनरी में व्यक्त करने के लिए 14 अंकों की आवश्यकता होती है; जो आंशिक भाग व्यक्त करने के महत्व के 10 अंक छोड़ देता है। इसलिए, आपको 1024 वें से 0.1 की सबसे नज़दीकी संख्या मिल जाएगी - जो 102/1024 है। यह 0.099609375 हो जाता है - इसलिए फ्लोट में 0.000390625 की गोलाकार त्रुटि है।

ऐसा लगता है कि आपके जावा प्रोग्राम में एक्स और एक्स 1 के बीच अंतर है।

मुझे डर है कि मैं एक सी # विशेषज्ञ नहीं हूँ कर रहा हूँ, तो क्यों सी # अलग है मैं आपको बता नहीं सकता।

0

यह आपके अभिव्यक्ति की compilers व्याख्या से कोई लेना देना नहीं है। आप किसी भी मध्यवर्ती प्रकार रूपांतरण निर्दिष्ट नहीं किया है के रूप में, संकलक रिवर्स जो आप उम्मीद करेंगे के बजाय, पहले प्रकार रूपांतरण और फिर गुणा के रूप में A * D प्रदर्शन करती है। यह एक अजीब परिणाम की तरह लग सकता है लेकिन यह संकलक क्या आप थकाऊ प्रकार रूपांतरण निर्दिष्ट किए बिना ही एक और अधिक सटीक परिणाम देने के लिए के लिए एक तरीका है।

जावा आप के लिए यह प्रबंधन नहीं करती है, और इसलिए (B * 100) + (A * D) एक int और एक float के गुणन है - एक float हो जाती है। यह इस तरह सी # में नकली जा सकता है:

double X2 = (float)((B * 100) + (A * D)) - (E/B)/C; 
Console.WriteLine("X2: {0}", X2); 

यह लाभ (या असंतुष्ट फायदे कुछ शायद कहते हैं) एक उच्च स्तरीय संकलक की से एक है।

संबंधित मुद्दे