2012-07-17 10 views
57

उदाहरण:फ्लोट घोषित करते समय "एफ" क्यों आवश्यक है?

float timeRemaining = 0.58f; 

क्यों f संख्या के अंत में की आवश्यकता है?

+4

Probab ly, क्योंकि अन्यथा इसे 'डबल' के रूप में माना जाएगा। –

+2

0.58 (एफ प्रत्यय के बिना) एक शाब्दिक प्रकार का दोगुना है और कोई एक फ्लोट के लिए डबल मान असाइन नहीं कर सकता है, जैसे कोई स्ट्रिंग को एक int मान निर्दिष्ट नहीं कर सकता है। हालांकि आप एक फ्लोट वैल्यू को डबल पर असाइन कर सकते हैं क्योंकि यहां आप चौड़े हैं (सी # निश्चित रूप से आपके लिए इसे कन्वर्ट कर देगा क्योंकि कोई सटीक नहीं खो जाएगा)। – davenewza

+0

संभावित डुप्लिकेट [हम सी # में अक्षर का उपयोग क्यों करना चाहिए?] (Http://stackoverflow.com/questions/732770/why-should-we-use-literals-in-c) – adatapost

उत्तर

62

एक नाव का आपका घोषणा दो भागों में शामिल हैं:

  1. यह घोषणा करता है कि चर timeRemaining प्रकार float की है।
  2. यह इस चर के लिए मूल्य 0.58 असाइन करता है।

समस्या हिस्सा 2.

दाएँ हाथ की ओर अपने आप ही मूल्यांकन किया जाता है में होता है। सी # विनिर्देश के अनुसार, एक दशमलव बिंदु वाला एक संख्या जिसमें प्रत्यय नहीं है double के रूप में व्याख्या किया गया है।

तो अब हमारे पास double मान है कि हम float प्रकार के एक चर को असाइन करना चाहते हैं। ऐसा करने के लिए, double से float पर एक निहित रूपांतरण होना चाहिए। ऐसा कोई रूपांतरण नहीं है, क्योंकि आप रूपांतरण में जानकारी खो सकते हैं (और इस मामले में)।

कारण यह है कि संकलक द्वारा इस्तेमाल किया मूल्य वास्तव में 0.58 नहीं है, लेकिन फ़्लोटिंग-बिंदु मान निकटतम 0.58 करने के लिए है, जो 0,57999999999999978655962351581366 है ... double के लिए और वास्तव में float के लिए .579999946057796478271484375।

कड़ाई से बोलते हुए, f आवश्यक नहीं है।

float timeRemaining = (float)0.58; 
+4

दो प्रश्न, आप '0.579999946057796478271484375' नंबर पर कैसे पहुंचे, और '(फ्लोट) 0.58' कैसे काम करेगा? आपने पहले कहा था कि कोई रूपांतरण नहीं है, क्योंकि जानकारी खो सकती है, तो कलाकार कैसे काम करेगा? – SexyBeast

+3

1. मैंने विंडोज कैलकुलेटर का उपयोग किया, जो 34 अंकों तक उपयोग करता है। 2. मैंने कहा कि कोई * अंतर्निहित * रूपांतरण नहीं है। एक कलाकार एक स्पष्ट रूपांतरण है, इसलिए आप स्पष्ट रूप से उस संकलक को बता रहे हैं जिसे आप रूपांतरण चाहते हैं, और इसकी अनुमति है। –

+0

दिलचस्प ... मुझे आशा है कि आप अभी भी इस पोस्ट की निगरानी कर रहे हैं। मैं पहले से देखे गए वेबकास्ट के लिए 'एम' में दौड़ने वाले प्रत्ययों के साथ पेश किया गया था। फ्लोट वैल्यू के रूप में .58 को प्रदर्शित करने के लिए आपको विंडोज कैलक्यूलेटर कैसे मिला? मैंने कुछ बटनों की कोशिश की जो ऐसा लग रहा था कि वे ऐसा होने के लिए मजबूर करेंगे लेकिन नहीं ... 0.58 मिल रहा है। मुझे ऐसे व्यक्ति का सम्मान करना है जो अपने उपकरणों को बहुत अच्छी तरह जानता है ... – user1585204

31

क्योंकि कई संख्यात्मक प्रकार हैं जो संकलक 0.58: float, double और decimal मान का प्रतिनिधित्व करने के लिए उपयोग कर सकते हैं। जब तक आप संकलक को आपके लिए चुनने के ठीक नहीं होते, तब तक आपको असंबद्ध होना पड़ता है।

double के लिए दस्तावेज़ में कहा गया है कि यदि आप प्रकार अपने आप को निर्दिष्ट नहीं करते संकलक हमेशा किसी भी वास्तविक सांख्यिक शाब्दिक के प्रकार के रूप double उठाता है:

डिफ़ॉल्ट रूप से, के दाईं ओर कोई वास्तविक सांख्यिक शाब्दिक असाइनमेंट ऑपरेटर को डबल के रूप में माना जाता है। हालांकि, अगर आप एक पूर्णांक संख्या डबल के रूप में इलाज किया जा करना चाहते हैं, प्रत्यय डी या डी

प्रत्यय f जोड़ बनाता है एक float का उपयोग करें; प्रत्यय d एक double बनाता है; प्रत्यय mdecimal बनाता है। ये सभी अपरकेस में भी काम करते हैं।

बहरहाल, यह अभी भी इस क्यों संकलन नहीं है समझाने के लिए पर्याप्त नहीं है:

float timeRemaining = 0.58; 

जवाब के लापता आधा है कि floattimeRemaining-double0.58 से रूपांतरण संभावित जानकारी खो देता है, तो है संकलक इसे लागू करने से इंकार कर देता है। यदि आप एक स्पष्ट कलाकार जोड़ते हैं तो रूपांतरण किया जाता है; यदि आप f प्रत्यय जोड़ते हैं तो कोई रूपांतरण की आवश्यकता नहीं होगी। दोनों मामलों में कोड संकलित करेगा।

+0

लेकिन वैरिएबल एक फ्लोट होने पर यह डबल या दशमलव कैसे हो सकता है, मुझे कुछ याद आ रहा है – Thomas

+0

@BlazArt हां, वाक्य जो कंपाइलर बताता है कि असाइनमेंट लक्ष्य को जांचने की कोशिश भी नहीं करता है। इसका कारण संकलक टीम द्वारा किए गए डिजाइन विकल्पों में दफनाया जाएगा। मुझे लगता है कि संभावित भ्रम के मामले में स्पष्ट होना सर्वोत्तम है, या केवल दो नियमों के बजाय कार्यान्वयन को परेशान करना बहुत महंगा था, एक 'int' के लिए और एक 'डबल' के लिए। –

+0

@ ब्लाज़आर्ट: बस जवाब देने से समाप्त हो गया, कृपया फिर से देखें। – Jon

1

समस्या यह है कि नेट, आदेश निहित आपरेशन के कुछ प्रकार के अनुमति देने के लिए float और double को शामिल किया जाना है, जरूरत है: आप एक float के लिए मूल्य कास्टिंग द्वारा f प्रत्यय उपयोग करने के लिए होने से बचने कर सकते हैं या तो स्पष्ट रूप से निर्दिष्ट करें कि मिश्रित ऑपरेटरों से जुड़े सभी परिदृश्यों में क्या होना चाहिए या अन्यथा केवल एक दिशा में किए जाने वाले प्रकारों के बीच अंतर्निहित रूपांतरण की अनुमति दें; माइक्रोसॉफ्ट ने जावा की अगुवाई को उस दिशा की अनुमति देने का चयन किया जो कभी-कभी परिशुद्धता का पक्ष लेता है, लेकिन अक्सर शुद्धता को त्याग देता है और आम तौर पर परेशानी पैदा करता है।

लगभग सभी मामलों में, double मूल्य है जो एक विशेष संख्यात्मक मात्रा के सबसे करीब है ले जा रहा है और एक float को यह बताए float मूल्य जो कि एक ही मात्रा के सबसे करीब है निकलेगा। कुछ कोने के मामले हैं, जैसे मूल्य 9,007,19 9, 7 9, 1111,905; सबसे अच्छा float प्रतिनिधित्व 9,007,200,328,482,816 (जो 536,870,911 से बंद है), लेकिन double प्रतिनिधित्व (यानी 9, 007,19 9, 7 9, 611,904) float पर 9,007,19 9, 254,740,992 (जो 536,870,913 से बंद है) का उत्पादन करता है। आम तौर पर, पर कुछ मात्रा के सर्वोत्तम double का प्रतिनिधित्व करने से या तो सबसे अच्छा संभव float प्रतिनिधित्व, या दो प्रतिनिधित्वों में से एक जो अनिवार्य रूप से उतना ही अच्छा है, को प्रस्तुत करेगा।

ध्यान दें कि यह वांछनीय व्यवहार चरम पर भी लागू होता है; उदाहरण के लिए, सर्वोत्तम float मात्रा 10^308 के लिए प्रतिनिधित्व float का प्रतिनिधित्व करता है जो उस मात्रा के सर्वोत्तम double का प्रतिनिधित्व करके प्राप्त किया गया है। इसी तरह, सर्वोत्तम float 10^30 9 का प्रतिनिधित्व float का प्रतिनिधित्व करता है जो उस मात्रा के सर्वोत्तम double का प्रतिनिधित्व करके प्राप्त किया गया है।

दुर्भाग्य से, उस दिशा में रूपांतरण जो स्पष्ट कलाकारों की आवश्यकता नहीं है, शायद ही कभी सटीक के करीब कहीं भी हैं। सर्वोत्तम float को double पर मान का प्रतिनिधित्व करने से शायद ही कभी उस मूल्य के सर्वोत्तम double का प्रतिनिधित्व करने के लिए कुछ भी उपज मिलेगा, और कुछ मामलों में परिणाम परिमाण के सैकड़ों आदेशों से दूर हो सकता है (उदाहरण के लिए float का प्रतिनिधित्व 10^40 double के लिए एक मूल्य है कि 10^300 का सबसे अच्छा double प्रतिनिधित्व से अधिक तुलना निकलेगा।

ओह, रूपांतरण नियम है कि वे क्या कर रहे हैं, इसलिए एक मूर्खतापूर्ण typecasts और प्रत्यय जब में मान परिवर्तित करने का उपयोग कर के साथ रहना पड़ता है कर रहे हैं "सुरक्षित" दिशा, और खतरनाक दिशा में अंतर्निहित टाइपकास्ट से सावधान रहें जो अक्सर फर्जी परिणाम उत्पन्न करेगी।

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