HINWEIS: Dies ist wahrscheinlich eine Frage über fehlerhafte Mathematik, anstatt eine Frage über den Windows-Systemaufruf wie in der Frage beschrieben.Konvertieren von 100-Nanosekunden in Millisekunde Verwirrung
Wir arbeiten mit dem Win32-Aufruf GetSystemTimeAsFileTime()
, und sehen, was ich denke, sind seltsame Ergebnisse und war auf der Suche nach etwas Klärung. Von MSDN auf der FILETIME-Struktur https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284%28v=vs.85%29.aspx
enthält einen 64-Bit-Wert, der die Anzahl von 100-Nanosekunden Intervalle seit 1. Januar 1601 (UTC).
Nach unseren Lesen dieser Beschreibung wird der zurückgegebene Wert ist die Anzahl der 10E-8 Intervall Sekunden. Unter der Annahme, dass dies korrekt ist, sollte die folgende Funktion die Systemzeit in Millisekunden zurückgeben.
DWORD get_milli_time() {
FILETIME f;
::GetSystemTimeAsFileTime(&f);
__int64 nano = (__int64(f.dwHighDateTime) << 32LL)
+ __int64(f.dwLowDateTime);
return DWORD(nano/10e5);
}
Eine einfache Unittest jedoch zeigt dies falsch ist, die im folgenden Code druckt „Fehler“:
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");
}
Nach diesem Posten SO Getting the current time (in milliseconds) from the system clock in Windows?, die richtigen Ergebnisse können durch eine Änderung unserer Division erreicht werden zu:
Wenn wir diesen Wert verwenden, erhalten wir das richtige Ergebnis, aber ich kann nicht verstehen, warum.
Es scheint mir, dass aus 10e-8 zu 10e-3 zu konvertieren, sollten wir durch 10e5 teilen. Dies scheint durch die folgende Berechnung bestätigt zu werden:
printf("%f\n", log10(10e-3/10e-8));
Welche gibt 5 zurück (wie ich erwartet habe).
Aber irgendwie irre ich mich - aber ich werde verdammt sein, wenn ich sehen kann, wo ich falsch gelaufen bin.
Haben Sie versucht, ruft 'get_milli_time()' zweimal, etwa 5 Sekunden auseinander, und es bei den Werten suchen gibt? – Beta