2016-03-28 8 views
0

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.

+0

Haben Sie versucht, ruft 'get_milli_time()' zweimal, etwa 5 Sekunden auseinander, und es bei den Werten suchen gibt? – Beta

Antwort

5

Ihre Mathematik ist in der Tat fehlerhaft, und so ist Ihr Verständnis des "Arbeits" -Codes.

Es gibt 10 100-Nanosekunden-Intervalle in einem zweiten, 10 in einer Millisekunde. In Fließkomma-Notation ist dies 1.0e4. 10e3 ist eine seltsame Art zu schreiben 1e4.

Die „richtigen“ (im Sinne der effizientesten während ausdrucks verbleibend) Code

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

Vielleicht ein Notationsfehler. '10^3' mit' 10e3', wenn es tatsächlich '10^3 = 1e3' ist – Nacho

+1

@Nacho: Nicht vielleicht, definitiv. –

+0

Mein Fehler war falsch * e * wissenschaftliche Notation. Vielen Dank. – user590028