2016-05-09 10 views
8

मैं जानना चाहता हूं कि एक सरल गणित ऑपरेशन के लिए कौन सा रूपांतरण बेहतर है (प्रदर्शन/गति और परिशुद्धता/सबसे कम नुकसान के संबंध में) और उन्हें क्या अलग बनाता है?सरल गणित ऑपरेशन के लिए कौन सा संख्यात्मक प्रकार रूपांतरण बेहतर है?

उदाहरण:

double double1 = integer1/(5 * integer2); 
var double2 = integer1/(5.0 * integer2); 
var double3 = integer1/(5D * integer2); 
var double4 = (double) integer1/(5 * integer2); 
var double5 = integer1/(double) (5 * integer2); 
var double6 = integer1/((double) 5 * integer2); 
var double7 = integer1/(5 * (double) integer2); 
var double8 = Convert.ToDouble(integer1/(5 * integer2)); 
var double9 = integer1/Convert.ToDouble(5 * integer2); 

वास्तव में मेरे सवाल का रूपांतरण के बारे में है नहीं प्रकार ही।

+1

'float1', 'float8' पूर्णांक विभाजन का उपयोग करेगा ताकि आप उन दोनों के बारे में तुरंत भूल सकें। बाकी के बारे में, यह वास्तव में इस बात पर निर्भर करता है कि 'integer1' और' integer2' के मान क्या हैं। मुझे लगता है कि आपको [यह] (http://stackoverflow.com/a/15117741/767890) पढ़ने की जरूरत है। निष्पादन के अनुसार, 'डबल 9' के लिए कोई कारण नहीं है, यह अनिवार्य रूप से 'डबल 5' जैसा ही है लेकिन अतिरिक्त संकेत के कारण धीमा है। – InBetween

+0

फ्लोट ऑपरेशंस के बारे में अच्छा लिंक। – MagB

+0

अगर मुझे * सीमांत * विजेता * प्रदर्शन के लिए शर्त लगाना पड़ा * * मैं 'डबल 4' या 'डबल 5' चुनता हूं और उन दोनों से, केवल पठनीयता के कारण, मैं' double4' चुनता हूं। – InBetween

उत्तर

5

संपादित

अपने पूरी तरह से बदली हुई प्रश्न के उत्तर में:

पहली पंक्ति double double1 = integer1/(5 * integer2); एक पूर्णांक विभाजन करता है, तो यह है कि ऐसा नहीं करते हैं।

इसके अलावा लाइन var double8 = Convert.ToDouble(integer1/(5 * integer2)); परिणाम को दो बार बदलने से पहले पूर्णांक विभाजन कर रहा है, इसलिए ऐसा न करें।

इसके अलावा, आपके द्वारा सूचीबद्ध सभी अलग-अलग दृष्टिकोण आपके नमूना कोड में प्रत्येक पंक्ति के लिए आईएल निर्देश Conv.R8 पर कॉल करना समाप्त कर देंगे।

केवल वास्तविक अंतर यह है कि Convert.ToDouble() ऐसा करने के लिए एक विधि कॉल करेगा, इसलिए आपको इससे बचना चाहिए।

double1 और double8 के अलावा प्रत्येक पंक्ति के परिणाम समान होंगे।

तो आप शायद सबसे सरल के लिए जाना चाहिए: var double2 = integer1/(5.0 * integer2);

एक और अधिक जटिल स्थिति में, समय अपने कोड अगर कोई मतभेद है देखने के लिए।

+0

Thx, मैंने अपना प्रश्न संपादित किया है। कृपया देखें। – MagB

+0

5.0 या 5 डी जैसे मूल संख्या का उपयोग करने से आम तौर पर धीमी या तेज (डबल) का उपयोग करके हार्ड टाइप रूपांतरण है? उदाहरण के लिए तुलना: var double6 = integer1/((डबल) 5 * integer2); वीएस var double2 = integer1/(5.0 * पूर्णांक 2); – MagB

+2

@MagB इससे कोई फर्क नहीं पड़ता - जैसे मैंने कहा, आपके द्वारा सूचीबद्ध सभी रूपांतरण 'Conv.R8'' को कॉल करते हैं (और इसे केवल आपके नमूना कोड की प्रत्येक पंक्ति के लिए बुलाया जाता है)। अधिक जटिल परिस्थितियों में, यह देखने के लिए कि आपका कोड कोई फर्क पड़ता है या नहीं। –

1
नाव/दशमलव डबल उपयोग करने के बजाय

:

सामान्य प्रश्न "डबल बनाम दशमलव" के लिए एक अधिक सामान्य जवाब: मौद्रिक गणना के लिए दशमलव परिशुद्धता, वैज्ञानिक गणना करते हैं कि छोटे से प्रभावित नहीं हो के लिए डबल को बचाने के लिये मतभेद। चूंकि डबल एक प्रकार है जो सीपीयू के मूल निवासी है (आंतरिक प्रतिनिधित्व बेस 2 में संग्रहीत होता है), डबल प्रदर्शन के साथ की गई गणना दशमलव के बाद बेहतर होती है (जिसे आंतरिक रूप से आधार 10 में दर्शाया जाता है)।

+0

thx। मैंने अपना प्रश्न संपादित किया है। कृपया देखें। – MagB

2

कोड की आपकी लाइनों के बीच अंतर रूपांतरणों के बारे में नहीं हैं, उनमें से कुछ पूरी तरह से अलग चीजें हैं और मान समान नहीं हैं।

1. float float1 = integer1/(5 * integer2); 

5 * interger2 एक int देता है, int बिताते हैं int एक int देता है, और आप एक float चर को int मान असाइन, अंतर्निहित रूपांतरण का उपयोग क्योंकि intfloat की तुलना में एक छोटे श्रृंखला है। float float1 = 1/(5 * 2), परिणामस्वरूप आपको System.Single 0 मिलेगा।

2. var float2 = integer1/(5.0 * integer2); 

5.0 अनिवार्य रूप से 5.0d है, इसलिए float2 के प्रकार, System.Double है var float2 = 1/(5.0 * 2) आप परिणाम के रूप में एक System.Double 0.1 मिल जाएगा।

3. var float3 = integer1/(5F * integer2); 

आप ऊपर ही मान का उपयोग करते हुए जो है तो आप शायद क्या चाहते हैं एक System.Single 0.1 मिल जाएगा।

4. var float4 = (float)integer1/(5 * integer2); 

आपको एक ही आइटम 3. के रूप में अंतर ITEM3 int divides by float है, जबकि item4 float divides by int है मिल जाएगा।

5. var float5 = integer1/(float) (5 * integer2); 
6. var float6 = integer1/((float) 5 * integer2); 
7. var float7 = integer1/(5 * (float) integer2); 

तीन लगभग आइटम 3 के रूप में ही कर रहे हैं, यह एक int divides by float गणना करता है, विभक्त निर्माण करने के लिए सिर्फ अलग अलग तरीकों से।

8. var float8 = Convert.ToDecimal(integer1/(5 * integer2)); 
9. var float9 = integer1/Convert.ToDecimal(5 * integer2); 

दो आप System.Decimal मूल्यों दे देंगे, जो एक उच्च परिशुद्धता है। Item8 में आइटम 1 के समान समस्या है, आपको 0 मिलेगा क्योंकि Convert.ToDecimal का पैरामीटर int 0.

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