注意:这可能是关于数学错误的问题,而不是一个问题
关于Windows系统调用,如问题中所述。

我们正在使用GetSystemTimeAsFileTime() win32调用,并看到我认为是奇怪的结果,并正在寻求澄清。从MSDN上的FILETIME结构https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284%28v=vs.85%29.aspx



根据我们对这一描述的理解,返回的值是 10e-8 间隔秒数。假设这是正确的,则下面的函数应返回以毫秒为单位的系统时间。

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

但是,一个简单的单元测试表明这是不正确的,下面的代码打印“Failed”:
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");
    }

根据这个帖子
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.0e410e3是一种编写1e4的怪异方法。

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

return DWORD(hundrednano * 1.0e-4);

10-06 02:17