use*_*028 0 c++ windows time filetime
注意:这可能是关于有缺陷的数学的问题,而不是关于问题中描述的Windows系统调用的问题.
我们正在使用GetSystemTimeAsFileTime()win32调用,看到我认为是奇怪的结果,并正在寻找一些澄清.来自MSDN的FILETIME结构https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284%28v=vs.85%29.aspx
包含一个64位值,表示自1601年1月1日(UTC)以来100纳秒间隔的数量.
根据我们对此描述的读取,返回的值是10e-8间隔秒的数量.假设这是正确的,那么以下函数应该以毫秒为单位返回系统时间.
DWORD get_milli_time() {
FILETIME f;
::GetSystemTimeAsFileTime(&f);
__int64 nano = (__int64(f.dwHighDateTime) << 32LL)
+ __int64(f.dwLowDateTime);
return DWORD(nano / 10e5);
}
Run Code Online (Sandbox Code Playgroud)
然而,一个简单的单元测试显示这是不正确的,下面的代码打印"失败":
DWORD start = get_milli_time();
::Sleep(5000); // sleep for 5-seconds
DWORD end = get_milli_time();
// test for reasonable sleep variance (4.9 - 5.1 secs)
if ((end - start) < 4900 || (end - start) > 5100) {
printf("Failed\n");
}
Run Code Online (Sandbox Code Playgroud)
根据这个SO帖子 从Windows中的系统时钟获取当前时间(以毫秒为单位)?,通过将我们的部门改为:
return DWORD(nano / 10e3);
Run Code Online (Sandbox Code Playgroud)
如果我们使用这个值,我们得到正确的结果,但我不明白为什么.
在我看来,要从10e-8转换为10e-3,我们应该除以10e5.这似乎可以通过以下计算得到证实:
printf("%f\n", log10(10e-3 / 10e-8));
Run Code Online (Sandbox Code Playgroud)
返回5(如我所料).
但不知怎的,我错了 - 但如果我能看到我出错的地方,我会被愚弄.
你的数学确实存在缺陷,你对"工作"代码的理解也是如此.
在一秒钟内有10 7 100纳秒的间隔,10 4毫秒的间隔.在浮点表示法中,这是1.0e4. 10e3是一种奇怪的写作方式1e4.
"正确"(在最有效的同时保持表达的意义上)代码将是
return DWORD(hundrednano * 1.0e-4);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1648 次 |
| 最近记录: |