Jestem programistą Objective-C z niewielkim doświadczeniem w C/C++ (i zerowym szkoleniem), a dziś napotkałem coś dziwnego z mocno zakodowanymi wartościami liczbowymi.Int to Double Casting Problem
Jestem pewien, że to jest proste/głupie pytanie, ale może ktoś proszę wyjaśnić, dlaczego to działa:
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
I to też działa (numer nuta sekund uległa zmianie):
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
Ale to jest realizowane natychmiast:
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
jednak zamiast korzystania 4.0
od 4
poprawek go:
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
Dlaczego 1 i 2 prawidłowo oddanych do odpowiedniej wartości podwójnym, ale większe liczby (testowałem 3 i 4) wydają się być reprezentowane 0
?
Jestem kompilacji z Xcode 4.2, skonfigurowany do używania LLVM 3.0.
EDIT:
dispatch_time_t jest zdefiniowany jako:
typedef uint64_t dispatch_time_t;
I dispatch_time jest:
dispatch_time_t dispatch_time(dispatch_time_t when, int64_t delta);
I NSEC_PER_SEC jest:
#define NSEC_PER_SEC 1000000000 /* nanoseconds per second */
Co to jest parametr dispatch_time? – Pubby
Dzięki @Pubby, zaktualizowałem pytanie. –
wydaje się bardzo dziwne, że 1,2 pracy i 3,4 nie ... Sprawdziłbym to dokładnie, ale na pewno widzisz przypadki, w których int oceni na 0f. –