c++ - 将 100 纳秒转换为毫秒混淆

标签 c++ windows time filetime

注意:这可能是一个关于有缺陷的数学的问题,而不是一个问题 关于问题中描述的 Windows 系统调用。

我们正在处理 GetSystemTimeAsFileTime() win32 调用,看到了我认为奇怪的结果,正在寻找一些说明。来自 MSDN 上的 FILETIME 结构 https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284%28v=vs.85%29.aspx

Contains a 64-bit value representing the number of 100-nanosecond intervals since January 1, 1601 (UTC).

根据我们对这段描述的阅读,返回的值是10e-8间隔秒数。假设这是正确的,那么下面的函数应该以毫秒为单位返回系统时间。

DWORD get_milli_time() {
    FILETIME f;
    ::GetSystemTimeAsFileTime(&f);
    __int64 nano = (__int64(f.dwHighDateTime) << 32LL)
                  + __int64(f.dwLowDateTime);
    return DWORD(nano / 10e5);
    }

然而,一个简单的单元测试表明这是不正确的,下面的代码打印“失败”:

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");
    }

根据这篇 SO 帖子 Getting the current time (in milliseconds) from the system clock in Windows? , 将我们的部门更改为:

return DWORD(nano / 10e3);

如果我们使用这个值,我们会得到正确的结果,但我不明白为什么。

在我看来,要从 10e-8 转换为 10e-3,我们应该除以 10e5。这似乎可以通过以下计算得到证实:

printf("%f\n", log10(10e-3 / 10e-8));

返回 5(如我所料)。

但不知何故我错了——但如果我能看到我哪里出错了,我会很高兴的。

最佳答案

你的数学确实有缺陷,你对“工作”代码的理解也是如此。

一秒钟有 107 个 100 纳秒间隔,一毫秒有 104 个。在浮点表示法中,这是 1.0e410e31e4 的奇怪写法。

“正确的”(在保持表达能力的同时最有效的意义上)代码是

return DWORD(hundrednano * 1.0e-4);

关于c++ - 将 100 纳秒转换为毫秒混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36268277/

相关文章:

c++ - 有没有什么办法允许在一个像这样的循环程序上进行多线程处理?

Golang 结构成员存储时间不持有值(value)

c++ - 如何在 Turbo C++ 中将整数作为命令行参数传递

c++ - 如何将 c++ 模块与 yaws 一起使用

c++ - WTSGetActiveConsoleSessionId 返回系统 session

java - 如何使用批处理脚本中的参数调用程序?

c++ - 在 IDL 文件上使用 opendds_idl 工具时出现 fatal error C1083

c++ - 查找字符串中不存在的最小子字符串

java - 为什么一个程序的执行时间变化很大?

linux - Linux下磁盘读写性能