Я разработчик Objective-C с небольшим опытом 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.
EDIT:
dispatch_time_t определяется как:
typedef uint64_t dispatch_time_t;
И диспетчер_time:
dispatch_time_t dispatch_time(dispatch_time_t when, int64_t delta);
И NSEC_PER_SEC:
#define NSEC_PER_SEC 1000000000 /* nanoseconds per second */