我是一個C/C++經驗(零培訓)的Objective-C開發人員,我今天遇到了一些奇怪的硬編碼數值。詮釋雙鑄造問題
我敢肯定,這是一個簡單的/愚蠢的問題,但也有人請解釋爲什麼這個工程:
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 */
什麼是dispatch_time的參數? – Pubby
謝謝@Pubby,我已經更新了這個問題。 –
這似乎很奇怪,1,2工作和3,4不...我會仔細檢查,但你肯定會看到整數將評估爲0f的情況。 –