संख्या के बाद "च"


102

fसंख्याओं के बाद क्या इंगित करता है? यह C या Objective-C से है? क्या इसे निरंतर संख्या में नहीं जोड़ने में कोई अंतर है?

CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);

क्या आप बता सकते हैं कि मैं सिर्फ क्यों नहीं लिखूंगा:

CGRect frame = CGRectMake(0, 0, 320, 50);

जवाबों:


88
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);

फ्लोट स्थिरांक का उपयोग करता है। (स्थिर 0.0 आमतौर पर ऑब्जेक्टिव-सी में एक डबल की घोषणा करता है; अंत में एक एफ डाल रहा है - 0.0f - स्थिरांक को एक (32-बिट) फ्लोट के रूप में घोषित करता है।)

CGRect frame = CGRectMake(0, 0, 320, 50);

इनटेस का उपयोग करता है जो स्वचालित रूप से फ्लोट में परिवर्तित हो जाएगा।

इस मामले में, दोनों के बीच कोई (व्यावहारिक) अंतर नहीं है।


24
सैद्धांतिक रूप से, संकलक स्मार्ट नहीं हो सकता है ताकि उन्हें संकलन समय पर तैरने के लिए परिवर्तित किया जा सके, और निष्पादन को चार int-> फ्लोट रूपांतरणों के साथ धीमा कर देगा (जो सबसे धीमी जाति में से हैं)। हालांकि इस मामले में लगभग महत्वहीन है, यह हमेशा सही ढंग से निर्दिष्ट करने के लिए बेहतर है यदि आवश्यक हो तो एफ: एक अभिव्यक्ति में बिना सही निर्दिष्टकर्ता पूरी अभिव्यक्ति को डबल में बदलने के लिए मजबूर कर सकता है, और यदि यह एक तंग लूप में है तो प्रदर्शन हिट हो सकता है ध्यान देने योग्य।
मैट्टो इटालिया

60

जब संदेह में कोडांतरक आउटपुट की जाँच करें। उदाहरण के लिए एक छोटा, न्यूनतम स्निपेट लिखें, जैसे

#import <Cocoa/Cocoa.h>

void test() {
  CGRect r = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f);
  NSLog(@"%f", r.size.width);
}

फिर इसे -Sविकल्प के साथ कोडांतरक पर संकलित करें ।

gcc -S test.m

test.sफ़ाइल में कोडांतरक आउटपुट को सहेजें और .0fस्थिरांक से हटा दें और संकलन कमांड को दोहराएं। फिर diffनए test.sऔर पिछले एक का करें। सोचें कि क्या वास्तविक मतभेद हैं या नहीं। मुझे लगता है कि बहुत से लोगों की दृष्टि है कि वे सोचते हैं कि संकलक क्या करता है, लेकिन दिन के अंत में किसी को यह जानना चाहिए कि किसी भी सिद्धांत को कैसे सत्यापित किया जाए।


11
आउटपुट बिना किसी के भी, मेरे लिए समान निकला -O। मैं i686-apple-darwin10-gcc-4.2.1 (GCC) पर
हूं

2
मैंने एलएलवीएम संस्करण 7.0.0 (क्लैंग -700.0.65) x86_64-apple-darwin15.0.0 और .out फ़ाइलों के साथ उपरोक्त उदाहरण की कोशिश की थी और साथ ही समान थे।
निक

43

कभी-कभी अंतर होता है।

float f = 0.3; /* OK, throw away bits to convert 0.3 from double to float */
assert ( f == 0.3 ); /* not OK, f is converted from float to double
   and the value of 0.3 depends on how many bits you use to represent it. */
assert ( f == 0.3f ); /* OK, comparing two floats, although == is finicky. */

26

यह कंप्यूटर को बताता है कि यह एक फ्लोटिंग पॉइंट नंबर है (मेरा मानना ​​है कि आप यहाँ c / c ++ की बात कर रहे हैं)। यदि संख्या के बाद कोई एफ नहीं है, तो इसे एक डबल या पूर्णांक माना जाता है (यह निर्भर करता है कि कोई दशमलव है या नहीं)।

3.0f -> float
3.0 -> double
3 -> integer

क्या यह C ++ मानक का कन्वेंशन पार्ट है या यह कंपाइलर में पाया जाता है?
jxramos 19

1
जहां तक ​​मैं बता सकता हूं कि यह मानक का हिस्सा है (किसी ने मुझे गलत होने पर सही किया है)। सबसे तेज़ संदर्भ जो मुझे मिल सकता है , वह है-std.org/jtc1/sc22/open/n2356/lex.html#lex.fcon । लेकिन अगर आप उनकी देखभाल करना चाहते हैं, तो संभवत: अधिक संदर्भ हैं।
निकेलएच

5

आपके स्रोत कोड में एक फ्लोटिंग पॉइंट शाब्दिक को डबल के रूप में पार्स किया गया है। इसे एक वैरिएबल को सौंपना जो कि टाइप फ्लोट का है, सटीकता खो देगा। बहुत अधिक सटीक, आप 7 महत्वपूर्ण अंक निकाल रहे हैं। "F" पोस्टफिक्स आपको कंपाइलर को बताता है: "मुझे पता है कि मैं क्या कर रहा हूं, यह जानबूझकर है। मुझे इसके बारे में बग न दें"।

बग के निर्माण की संभावनाएं उस छोटे btw नहीं है। कई कार्यक्रम ने एक गलत कल्पना की गई फ्लोटिंग पॉइंट तुलना पर भरोसा किया है या यह मानते हुए कि 0.1 बिल्कुल प्रतिनिधित्व करने योग्य है।


4

fआप जिस बारे में बात कर रहे हैं, वह संभवतः संकलक को बताने के लिए है जो यह एक फ्लोट के साथ काम कर रहा है। जब आप fइसे छोड़ देते हैं , तो इसे आमतौर पर एक दोहरे में अनुवादित किया जाता है।

दोनों फ्लोटिंग पॉइंट नंबर हैं, लेकिन ए की तुलना में floatकम बिट्स (इस तरह छोटे और कम सटीक) का उपयोग करता है double


3

यह एक सी बात है - फ्लोटिंग पॉइंट शाब्दिक डिफ़ॉल्ट रूप से डबल परिशुद्धता (डबल) हैं। एक f प्रत्यय जोड़ने से वे एकल परिशुद्धता (फ्लोट) बन जाते हैं।

आप यहां मूल्यों को निर्दिष्ट करने के लिए ints का उपयोग कर सकते हैं और इस मामले में इससे कोई फर्क नहीं पड़ेगा, लेकिन सही प्रकार का उपयोग करने के लिए एक अच्छी आदत है - स्थिरता सामान्य रूप में एक अच्छी बात है, और यदि आपको बाद में इन मूल्यों को बदलने की आवश्यकता है 'पहली नज़र में पता चल जाएगा कि वे किस प्रकार के हैं।


2

सी। से इसका अर्थ है फ्लोट शाब्दिक स्थिरांक। आप "f" और ".0" दोनों को छोड़ सकते हैं और अपने उदाहरणों में ints का उपयोग तैरने के लिए ints के अंतर्निहित रूपांतरण के कारण कर सकते हैं।


1

यह लगभग निश्चित रूप से सी से है और एक 'डबल' प्रकार के बजाय एक 'फ्लोट' का उपयोग करने की इच्छा को दर्शाता है। यह प्रत्यय के समान है जैसे कि संख्याओं पर L यह इंगित करने के लिए कि वे लंबे पूर्णांक हैं। आप बस पूर्णांक का उपयोग कर सकते हैं और संकलक ऑटो को इस विशिष्ट परिदृश्य के लिए उपयुक्त रूप में परिवर्तित कर देगा।


0

यह आमतौर पर संकलक को बताता है कि मान एक है float, यानी एक फ्लोटिंग पॉइंट पूर्णांक। इसका मतलब है कि यह पूर्णांक, दशमलव मान और घातांक, जैसे 1, 0.4या स्टोर कर सकता है 1.2e+22

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.