Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将100纳秒转换为毫秒_C++_Windows_Time_Filetime - Fatal编程技术网

C++ 将100纳秒转换为毫秒

C++ 将100纳秒转换为毫秒,c++,windows,time,filetime,C++,Windows,Time,Filetime,注意:这可能是一个关于有缺陷的数学的问题,而不是一个问题 关于问题中描述的windows系统调用 我们正在使用GetSystemTimeAsFileTime()win32调用,看到了我认为奇怪的结果,并希望得到一些澄清。从文件时结构上的MSDN 包含表示100纳秒数的64位值 自1601年1月1日(UTC)起的间隔时间 根据我们对本说明的阅读,返回的值是10e-8间隔秒数。假设这是正确的,那么下面的函数应该以毫秒为单位返回系统时间 DWORD get_milli_time() { FIL

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

我们正在使用
GetSystemTimeAsFileTime()
win32调用,看到了我认为奇怪的结果,并希望得到一些澄清。从文件时结构上的MSDN

包含表示100纳秒数的64位值 自1601年1月1日(UTC)起的间隔时间

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

DWORD get_milli_time() {
    FILETIME f;
    ::GetSystemTimeAsFileTime(&f);
    __int64 nano = (__int64(f.dwHighDateTime) << 32LL)
                  + __int64(f.dwLowDateTime);
    return DWORD(nano / 10e5);
    }
如果我们使用这个值,我们会得到正确的结果,但我不明白为什么

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

printf("%f\n", log10(10e-3 / 10e-8));
返回5(正如我所预料的)


但不知何故,我错了——但如果我能看出我错在哪里,那我就倒霉了。

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

一秒钟有107到100纳秒的间隔,一毫秒有104纳秒的间隔。在浮点表示法中,这是
1.0e4
10e3
是一种奇怪的书写方式
1e4

“正确”(在保持表达能力的同时效率最高)的代码应该是

return DWORD(hundrednano * 1.0e-4);

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

一秒钟有107到100纳秒的间隔,一毫秒有104纳秒的间隔。在浮点表示法中,这是
1.0e4
10e3
是一种奇怪的书写方式
1e4

“正确”(在保持表达能力的同时效率最高)的代码应该是

return DWORD(hundrednano * 1.0e-4);

您是否尝试过调用
get_milli_time()
两次,间隔约5秒,并查看它给出的值?您是否尝试调用
get_milli_time()
两次,间隔约5秒,并查看它给出的值?可能是记法错误<代码>10^3与
10e3
一起使用,而实际上它是
10^3=1e3
@Nacho:不可能,绝对不是。我的错误是科学符号不正确。谢谢。可能是记谱错误<代码>10^3与
10e3
一起使用,而实际上它是
10^3=1e3
@Nacho:不可能,绝对不是。我的错误是科学符号不正确。谢谢
return DWORD(hundrednano * 1.0e-4);