1

注:これは、質問で説明されている Windows システム コールに関する質問ではなく、数学の欠陥に関する質問である可能性があります。

私たちは win32 呼び出しに取り組んでおり、GetSystemTimeAsFileTime()奇妙な結果だと思われるものを見て、明確化を求めていました。FILETIME 構造の MSDN から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 を返します (予想どおり)。

しかし、どういうわけか私は間違っています。

4

1 に答える 1

7

あなたの数学には確かに欠陥があり、「動作する」コードの理解にも欠陥があります。

1 秒には 10 7 100 ナノ秒、1 ミリ秒には 10 4の間隔があります。浮動小数点表記では、これは1.0e4. 10e3は奇妙な書き方1e4です。

「正しい」(表現力を保ちながら最も効率的なという意味で)コードは次のようになります。

return DWORD(hundrednano * 1.0e-4);
于 2016-03-28T18:23:19.207 に答える