2011-12-07 10 views
13

मैं थोड़ा सी/सी ++ अनुभव (और शून्य प्रशिक्षण) के साथ एक उद्देश्य-सी डेवलपर हूं, और मुझे हार्ड कोडित संख्यात्मक मानों के साथ आज कुछ अजीब सामना करना पड़ा।इंटेल टू डबल कास्टिंग इश्यू

मुझे यकीन है कि यह एक सरल/बेवकूफ सवाल है, लेकिन किसी को कर सकते हैं कृपया बताएं कि इस काम करता हूँ:

NSDate *start = [NSDate date]; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC); 

dispatch_after(popTime, dispatch_get_main_queue(), ^{ 
    NSLog(@"seconds: %f", [start timeIntervalSinceNow]); 
}); 
// output: seconds: -1.0001 

और यह भी काम करता है (सेकंड का ध्यान नंबर बदल गया है):

NSDate *start = [NSDate date]; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC); 

dispatch_after(popTime, dispatch_get_main_queue(), ^{ 
    NSLog(@"seconds: %f", [start timeIntervalSinceNow]); 
}); 
// output: seconds: -2.0001 

लेकिन यह तुरंत क्रियान्वित किया जाता है:

NSDate *start = [NSDate date]; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 4 * NSEC_PER_SEC); 

dispatch_after(popTime, dispatch_get_main_queue(), ^{ 
    NSLog(@"seconds: %f", [start timeIntervalSinceNow]); 
}); 
// output: seconds: -0.0001 

हालांकि, बजाय 4.0 का उपयोग कर 4 फिक्स इसके बारे में:

NSDate *start = [NSDate date]; 
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 4.0 * NSEC_PER_SEC); 

dispatch_after(popTime, dispatch_get_main_queue(), ^{ 
    NSLog(@"seconds: %f", [start timeIntervalSinceNow]); 
}); 
// output: seconds: -4.0001 

क्यों 1 और 2 ठीक से प्रासंगिक डबल मूल्य पर कास्ट करते हैं, लेकिन बड़ा संख्या (मैं 3 का परीक्षण किया और 4) 0 के रूप में प्रतिनिधित्व होना दिखाई देते हैं?

मैं Xcode 4.2 के साथ संकलन कर रहा हूँ, LLVM 3.0 उपयोग करने के लिए कॉन्फ़िगर किया गया।

संपादित करें:

dispatch_time_t के रूप में परिभाषित किया गया है:

typedef uint64_t dispatch_time_t; 

और dispatch_time है:

dispatch_time_t dispatch_time(dispatch_time_t when, int64_t delta); 

और NSEC_PER_SEC है:

#define NSEC_PER_SEC 1000000000 /* nanoseconds per second */ 
+0

dispatch_time के पैरामीटर क्या है? – Pubby

+0

धन्यवाद @ पब्बी, मैंने सवाल अपडेट किया है। –

+0

जो बहुत अजीब लगता है कि 1,2 काम और 3,4 नहीं ... मैं इसे दोबारा जांचूंगा, लेकिन आप निश्चित रूप से उन उदाहरणों को देखते हैं जहां स्याही 0 एफ का मूल्यांकन करेंगे। –

उत्तर

25

एक सेकंड में 1,000,000,000 नैनोसेकंड हैं, इसलिए मुझे लगता है कि NSEC_PER_SEC को 1000000000 के रूप में परिभाषित किया गया है।

  • 4 प्रकार int
  • 4.0 की है double

अब यह सोचते हैं कि एक int 32 बिट शामिल प्रकार का है, एक int की सीमा [-2,147,483,648 to 2,147,483,647]

4000000000 > 2147483647 होगा, इसलिए आप int ओवरफ्लो का कारण बन जाएगा, जिससे मूल्य हो सकता है टी से 0.

संपादित करें: शायद मैं उपरोक्त कथन को बेहतर तरीके से कह सकता था। अतिप्रवाह int (जैसा कि ऊपर कहा गया है यह सोचते हैं यह आकार में 32 बिट है,) मूल्य -294967296 बराबर करने के लिए पैदा कर सकता है, और dispatch_time 0 सेकंड के रूप में किसी भी मूल्य <= 0 इलाज किया जाएगा। यही वह जगह है जहां से ऊपर "0" आया था।

एक double चर एक int से बड़ा मान हो सकते हैं, और मूल्य 4000000000 की एक सन्निकटन स्टोर करने के लिए सक्षम है।

+0

एक बिल्कुल स्पष्ट उत्तर के लिए धन्यवाद। :) –

+1

बिल्कुल स्पॉट पर। +1। –

+1

जब गणना ओवरफ्लो हो जाती है, तो आप चारों ओर लपेटेंगे, शून्य नहीं। यहां मूल्य शायद <0 होगा, और प्रेषण संभवत: 'इसे तुरंत करें' के रूप में व्यवहार कर रहा है। –

7

क्योंकि 1 पहले दो काम * 10^9 और 2 * 10^9 एक हस्ताक्षरित 32-बिट int में फिट है। हालांकि, 4 * 10^9 एक हस्ताक्षरित 32-बिट int में फिट नहीं होगा।

4,0 * 10^9 काम करता है क्योंकि चल बिन्दु है कि मूल्य का प्रतिनिधित्व कर सकते हैं।

मैं उम्मीद करते हैं कि यह भी काम करेगा:

dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, ((int64_t)4) * NSEC_PER_SEC); 
2

मैं उद्देश्य सी के बारे में कुछ भी नहीं पता है, लेकिन मेरा अनुमान है कि 4 * NSEC_PER_SEC एक 32-बिट पूर्णांक के लिए बहुत बड़ा है। 4.0 का उपयोग कर आप चल बिन्दु गणित में गुणन बल और समस्या को हल मिलता है।

अद्यतन

यह 64-बिट कोड हो सकता है लेकिन कुछ भाषाओं में (और मैं जानता हूँ कि सी # से एक है) एक 32-बिट पर हस्ताक्षर किए पूर्णांक पर संख्यात्मक शाब्दिक चूक जब तक आप स्पष्ट यह अन्यथा परिभाषित करते हैं। हो सकता है कि यहां क्या हो रहा है।

+0

धन्यवाद, "एनएसईसी" नैनोसेकंड है, इसलिए यह एक बड़ी संख्या है। मैंने अपनी परिभाषा के साथ अपना प्रश्न अपडेट किया है। वैसे, यह सभी 64 बिट कोड है, हालांकि मुझे नहीं पता कि इससे कोई फर्क पड़ता है या नहीं। –

+0

मेरा अद्यतन उत्तर देखें। –

+0

हां, 32-बिट यूनिक्स या 64-बिट यूनिक्स पर, int 32-बिट –

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