Sono uno sviluppatore Objective-C con poca esperienza C/C++ (e formazione zero) e ho riscontrato qualcosa di strano oggi con valori numerici codificati.Problema di trasmissione da Int a Double
Sono sicuro che è un semplice/domanda stupida, ma qualcuno può spiegare il motivo per cui questo funziona:
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
E questo funziona anche (numero di nota di secondi è cambiato):
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
Ma questo viene eseguito immediatamente:
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
Tuttavia, utilizzando invece 4.0
di 4
lo fissa:
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
Perché 1 e 2 correttamente espressi al valore doppio rilevante, ma i numeri più grandi (I testate 3 e 4) sembrano essere rappresentate come 0
?
Sto compilando con Xcode 4.2, configurato per utilizzare LLVM 3.0.
EDIT:
dispatch_time_t è definito come:
typedef uint64_t dispatch_time_t;
E dispatch_time è:
dispatch_time_t dispatch_time(dispatch_time_t when, int64_t delta);
E NSEC_PER_SEC è:
#define NSEC_PER_SEC 1000000000 /* nanoseconds per second */
Che cos'è il parametro dispatch_time? – Pubby
Grazie a @Pubby, ho aggiornato la domanda. –
che sembra molto strano che 1,2 lavoro e 3,4 non ... Lo controllerò due volte, ma sicuramente vedrai i casi in cui i valori saranno valutati a 0f. –