NOTE:這可能是一個關於有缺陷的數學問題,而不是問題 關於問題中所述的Windows系統調用。將100納秒轉換爲毫秒級混淆
我們正在與GetSystemTimeAsFileTime()
win32調用,並看到我認爲是奇怪的結果,並尋求一些澄清。從MSDN上FILETIME結構https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284%28v=vs.85%29.aspx
包含自1601年1月1,(UTC) 間隔代表100納秒的數量的64位值。
根據我們的這個描述的讀出,返回的值是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(如我所料)。
但是不知何故,我錯了 - 但是如果我能看到我出問題的地方,我會很難過。
你有沒有打過電話'get_milli_time()'兩次,約5秒分開,並查看值它原因呢? – Beta