Windows Epochから現在までナノ秒を計算すると、マイクロ秒の粒度が得られますか?

Windows Epochから現在までナノ秒を計算すると、マイクロ秒の粒度が得られますか?

Ubuntu Linux 16.04およびg ++を使用して、Unix EpochまたはWindows Epochと任意の日付/時刻の間のナノ秒数を計算するときにマイクロ秒またはミリ秒の粒度を取得できるかどうか疑問に思います。 time(NULL) の time_t 結果には秒単位があるのに対して、 gettimeofday の構造体 timeval 結果にはミリ秒単位があることがわかります。

この問題を解決する他の方法は何ですか?これはプログラミングの質問ではありません。私はこれをテストするためのプログラムを書いており、必要に応じて共有できます。

どんな助けでも大変感謝します。

答え1

を使用してこれを行うことができますgettimeofday()。これはStackOverflowへの回答、ここに引用します。

マイクロ秒タイムスタンプを取得するには2つのオプションがあります。最初の(そして最良の)オプションはタイプを直接使用することですtimeval

struct timeval GetTimeStamp() {
    struct timeval tv;
    gettimeofday(&tv,NULL);
    return tv;
}

2番目に私にとって理想的ではないオプションは、uint64_tからuint64_tを構築することですtimeval

uint64_t GetTimeStamp() {
    struct timeval tv;
    gettimeofday(&tv,NULL);
    return tv.tv_sec*(uint64_t)1000000+tv.tv_usec;
}

答え2

私の答えは10進64形式を使用することです。

から引用https://en.wikipedia.org/wiki/Decimal64_floating-point_format:

コンピューティングでは、10進数64は、コンピュータメモリの8バイト(64ビット)を占める10進浮動小数点コンピュータ番号指定形式です。財務および税計算など、正確な小数点丸めシミュレーションが必要なアプリケーションに適しています。

Decimal64 は 16 の有効有効数字をサポートし、指数範囲は -383 ~ +384、つまり ±0.000000000000000×10–383 ~ ±9.999999999999999×10384 です。 (±0000000000000000×10−398〜±99999999999999×10369と同じです。)これとは対照的に、最も一般的に使用されるバイナリ形式のおおよその範囲は±0.000000000000001×16 - 3 308です。したがって、最大値の有効数字が16個未満の場合、1×102=0.1×103=0.01×104など多様な表現が可能です。 0の可能な表現は768です(2つの符号付きゼロが含まれている場合は1536)。

Decimal64浮動小数点は、2008バージョンのIEEE 754 [1]およびISO / IEC / IEEE 60559:2011で正式に導入された比較的新しい10進浮動小数点形式です。

以下は、10進数64の使用方法を説明するリンクです。

https://stackoverflow.com/questions/12865585/stddecimaldecimal64-Cordirect-usage-g-4-6-3

答え3

Decimal64 float ソリューションがベストですが、匿名共用体を使用するプログラミング魔法が必要です。 decimal64をstd :: stringに変換するには、2つのメンバー(名前がSであると仮定)、10進数::decimal64入力、およびuint64_t(C ++ 99のcstdint.h)出力を持つ共用体を使用する必要があります。共用体には C++ クラスで、カスタムコンストラクタとデストラクタが必要な素数 ::decimal64 メンバがあるため、入力メンバ値を設定して出力メンバ値を変更するには、新しい put 演算子を使用する必要があります。

さらに、プログラマーはSオブジェクト(名前付きデータなど)を次のように初期化する必要があります。 S data = {12345678987654321ULL} これで、コンパイラは背後から共用体オブジェクトを削除しません。問題をさらに複雑にするのは、decimal/decimal.h がインラインコンストラクタのインライン decimal64::decimal64(decimal64__r) を定義しないことです。最後に、ユーザーは10進数64のグローバルostream演算子<<を作成する必要があります。

私の人生を簡単にするために、今日はuint64_tを使用して今日のWindows時代のナノ秒数を表します。このオプションはint64_t番号オーバーフローエラーを修正しました。

uint64_tと10進数64の間のトレードオフは、10進数64がuint64_tよりも大きなダイナミックレンジを持つことです。また、uint64_tのprintfには特別な書式指定子が必要です。

   #include <inttypes.h>
    uint64_t t;
    printf("%" PRIu64 "\n", t);

質問がある場合、またはコード例が必要な場合はお知らせください。

関連情報