Soy un desarrollador Objective-C con poca experiencia en C/C++ (y cero capacitación), y encontré algo extraño hoy con valores numéricos codificados.Problema Int to Double casting
Estoy seguro de que es una simple pregunta/estúpida, pero por favor alguien puede explicar por qué esto funciona:
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
Y esto también funciona (número de nota de segundos ha cambiado):
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
Pero esto se ejecuta inmediatamente:
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
Sin embargo, utilizando en su lugar 4.0
4
de lo fija:
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
¿Por qué 1 y 2 adecuadamente fundido al valor doble relevante, pero los números más grandes (he probado 3 y 4) parecen estar representado como 0
?
Estoy compilando con Xcode 4.2, configurado para usar LLVM 3.0.
EDIT:
dispatch_time_t se define como:
typedef uint64_t dispatch_time_t;
Y dispatch_time es:
dispatch_time_t dispatch_time(dispatch_time_t when, int64_t delta);
Y NSEC_PER_SEC es:
#define NSEC_PER_SEC 1000000000 /* nanoseconds per second */
¿Cuál es el parámetro de dispatch_time? – Pubby
Gracias @Pubby, he actualizado la pregunta. –
que parece muy extraño que 1,2 trabajo y 3,4 no ... Lo comprobaría dos veces, pero sí se observan instancias donde los resultados se evaluarán a 0f. –