2016-03-28 75 views
0

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-810E-3轉換,我們應該10E5劃分。這似乎通過以下計算得到證實:

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

返回5(如我所料)。

但是不知何故,我錯了 - 但是如果我能看到我出問題的地方,我會很難過。

+0

你有沒有打過電話'get_milli_time()'兩次,約5秒分開,並查看值它原因呢? – Beta

回答

5

你的數學確實有缺陷,你對「工作」代碼的理解也是有缺陷的。

有10 在一秒內100納秒的間隔,一毫秒內的10納秒間隔。在浮點標記中,這是1.0e410e3是一種奇怪的寫作方式1e4

的「權利」(在一定意義上的最有效的,而其餘的表現)代碼將是

return DWORD(hundrednano * 1.0e-4); 
+0

也許是記號錯誤。 '10^3'與'10e3'當它實際上是'10^3 = 1e3' – Nacho

+1

@Nacho:不是,絕對。 –

+0

我的錯誤是不正確的* e *科學記數法。謝謝。 – user590028