(C) 中的 `[[NSDate date] timeIntervalSince1970]` 自由函数总是 returns 相同的值
`[[NSDate date] timeIntervalSince1970]` in (C) free function always returns same value
如果我有:
double now_ms() {
return 1000 * (float)[[NSDate date] timeIntervalSince1970];
};
:
NSLog( @"%f", now_ms() ); // inside a CADisplayLink tick-event
每次都给出相同的值。
我可以通过创建 Lambda 来解决这个问题:
double (^now_ms)(void) = ^() {
return 1000.f * [[NSDate date] timeIntervalSince1970];
};
NSLog( @"%f", now_ms() ); // works!
不过我更希望它是一个免费功能。
这是怎么回事?
我怀疑这是某种 运行 时间优化。
问题是 NSTimeInterval
(which is what timeIntervalSince1970
returns) 是一个 double
而你要将它转换为 float
。但是 float
只能捕获大约 7 位有效数字。这还不够准确,无法捕捉自 1970 年以来的秒数,更不用说毫秒数了。
您的 lambda 解决方案之所以有效,只是因为您删除了 float
转换。你可以对你的函数做同样的事情:
double now_ms() {
return 1000.0 * [[NSDate date] timeIntervalSince1970];
}
如果我有:
double now_ms() {
return 1000 * (float)[[NSDate date] timeIntervalSince1970];
};
:
NSLog( @"%f", now_ms() ); // inside a CADisplayLink tick-event
每次都给出相同的值。
我可以通过创建 Lambda 来解决这个问题:
double (^now_ms)(void) = ^() {
return 1000.f * [[NSDate date] timeIntervalSince1970];
};
NSLog( @"%f", now_ms() ); // works!
不过我更希望它是一个免费功能。
这是怎么回事?
我怀疑这是某种 运行 时间优化。
问题是 NSTimeInterval
(which is what timeIntervalSince1970
returns) 是一个 double
而你要将它转换为 float
。但是 float
只能捕获大约 7 位有效数字。这还不够准确,无法捕捉自 1970 年以来的秒数,更不用说毫秒数了。
您的 lambda 解决方案之所以有效,只是因为您删除了 float
转换。你可以对你的函数做同样的事情:
double now_ms() {
return 1000.0 * [[NSDate date] timeIntervalSince1970];
}