1

I have a very large nanosecond value (representing nanoseconds since epoch) which I try to break down into seconds since epoch and nanoseconds like this:

uint64_t nanosecondsEpoch;
unsigned secs = nanosecondsEpoch / 1000000000ULL;
unsigned nanos = nanosecondsEpoch - (secs * 1000000000ULL);

the problem is if I try to stitch it back together like this:

uint64_t stichBack = secs * 1000000000ULL + nanos

私は道から外れている何かを手に入れます。その理由は、除算を実行すると、秒で 1357314854.03 が得られ、0.03 がドロップされるためだと思います (大きな不一致の原因となります)..しかし、両方の情報を保存できるはずなので混乱していますフロートに頼らずに、署名されていない情報を回復しますか? 私がキャッチできないように見える算数で何かばかげたことをしていますか?

以下に具体例を示します。

今日の午前中のエポック時刻からのナノ秒の値: 1357314854032484000

署名なしの秒とナノ秒の両方で使用できる場合は uint64_t を使用しますが、上記の値を上記のように分割して元に戻すことができない理由が不思議です。

4

1 に答える 1

2

1e9は (符号なし 32 ビット整数の最大値) より小さいため2^32-1、元の値が十分に大きい場合でも、商は大きすぎて 32 ビット整数に収まらない場合があります。元の値が何であるかはわかりませんがsecs、結果として値を切り捨てている可能性があります。

于 2013-01-04T17:00:22.920 に答える