2010-09-13 12 views
18

कुछ वास्तव में अजीब हो रहा है।उद्देश्य-सी विभाजन हमेशा 0

float p1 = (6/100); 
NSLog(@"p1 = %f", p1); 

कोड मैं निम्नलिखित आउटपुट प्राप्त की उन दो लाइनों के साथ:

p1 = 0,000000

स्थिर संख्या के साथ एक सरल विभाजन क्यों काम नहीं कर रहा है! काम करने से विभाजित करने के लिए सौदा करने के लिए मेरे पास इतना काम है! वह क्या बिल्ली है, क्या मैं पागल हूँ?

उत्तर

35

उन स्थिरांक पूर्णांक हैं, इसलिए गणित पूर्णांक गणित के साथ किया जाता है। प्रयास करें

float p1 = (6.0/100.0); 

संपादित — @Stephen कैनन बुद्धिमानी से बताते हैं कि जब से "p1" एक float है, वहाँ float रूप में पूरे गणना करने के लिए नहीं कोई कारण नहीं है:

float p1 = (6.0f/100.0f); 

अब, उन के बाद से चीजें दोनों स्थिरांक हैं, मुझे लगता है कि वास्तव में एक अच्छा मौका है कि काम को संकलक द्वारा वैसे भी किया जा रहा है। यह भी सच है कि कुछ आधुनिक मशीनों (यानी, इंटेल आर्किटेक्चर) पर, फ्लोटिंग-पॉइंट प्रोसेसर निर्देश सेट पर्याप्त अजीब है कि एक स्पष्ट "ऑप्टिमाइज़ेशन" जैसा लगता है कि ऐसा कुछ भी हो सकता है या नहीं। अंततः मुझे लगता है कि यह हो सकता है कि float स्थिरांक के साथ ऑपरेशन कर रहे हों (कुछ मामलों में) double मानों के साथ ऑपरेशन कर रहे हैं और फिर float पर कास्टिंग कर रहे हैं, जो कि यदि सत्य संभवतः सबसे अच्छा तर्क होगा एक तरफ या दूसरे का फैसला करना।

+0

धन्यवाद उपयोग कर सकते हैं, कि यह किया गया था। –

+4

अगर आपको अपने प्रश्न का उत्तर दिया गया तो आपको वास्तव में जवाब स्वीकार करना चाहिए। – imaginaryboy

+1

लेकिन डबल-सिंगल से अनावश्यक रूपांतरण से बचने के लिए सिंगल-प्रेसिजन अक्षर का उपयोग करें: 'फ्लोट पी 1 = 6.0 एफ/100.0 एफ' –

9

आपके असाइनमेंट में एक पूर्णांक विभाजन होता है, जो शून्य को वापस देता है यदि आप जिस संख्या को विभाजित कर रहे हैं वह अधिक है। आप शायद करने के लिए होती:

float p1 = (6.0f/100.0f); 
12

चूंकि ये संख्याएं के दोनों कंप्यूटर द्वारा पूर्णांकों माना जाता है, पूर्णांक गणित किया जाता है और एक पूर्णांक नहीं दशमलव जो है 0 (0.06) के साथ वापस आ रहा है, तो फ्लोट करने के लिए परिवर्तित और परिवर्तनीय पी 1 में संग्रहीत।

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

float p1 = (6.0/100); 

या आप यह

float p1 = ((float)6/100); 
1

एक काम के आसपास दो पूर्णांक चर विभाजित और नाव परिणाम प्राप्त करने के टाइपकास्ट सकता है।

int x = 5; 
int y = 7; 

float z = x/y; // always 0 

ठीक:

float z = 1.0 * x/y; 

नोट: यदि आप आदेश को बदल इस समाधान काम नहीं करेगा।

संपादित करें: इस जवाब previous answer के अनुसार आप इस

float z = (float) x/y; 
संबंधित मुद्दे