Я разработчик Objective-C с небольшим опытом работы с 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.
РЕДАКТИРОВАТЬ:
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 */