2017-11-06 7 views
-1

私は答えが簡単だと確信していますが、私はそれを得ていません。Cでlongを減算すると精度が失われますか?

struct timespec start, finish, diff; 
int ndiff; 

/* Structs are filled somewhere else */ 

diff.tv_sec = finish.tv_sec - start.tv_sec; 
ndiff = finish.tv_nsec - start.tv_nsec; 
if (ndiff < 0) { 
    diff.tv_sec--; 
    ndiff = 1L - ndiff; 
} 
diff.tv_nsec = ndiff; 

printf("Elapsed time: %ld.%ld seconds.\n", diff.tv_sec, diff.tv_nsec); 

ただし、出力は私がこれらのことから(ナノ秒の最後の3桁を失っていたことを示すように思わElapsed time: 0.300876000 seconds.のようなものが常にある:私はこのコードを使用して2つのstruct timespec間の差分を計算しようとしています常にゼロであるべきではない)。誰かがそれを引き起こしていることを指摘できますか?

+3

timespecが正確にナノ秒になるという保証はありません。 – rici

+4

'ndiff = 1L - ndiff;'は間違っています。 –

+0

...または 'struct timespec'を実装するかもしれないシステムインタフェースが、ナノ秒の解像度を保証するものではないと言う方がより正確でしょう。 –

答えて

2

経過時間:0.300876000秒。これはナノ秒の最後の3桁が失われていることを示しているようです(これらは常にゼロであるべきではないためです)。誰かがそれを引き起こしていることを指摘できますか?

コードの時計の精度は1000nsです。

diff.tv_sec@John Bollinger@rici

及び/又はは必ずしもlongありません。一致する指定子を使用します。

また
// printf("Elapsed time: %ld.%ld seconds.\n", diff.tv_sec, diff.tv_nsec); 
// Also insure fraction is printed with 9 digits 
printf("Elapsed time: %lld.%09ld seconds.\n", (long long) diff.tv_sec, diff.tv_nsec); 

、間違った "借り" 数学ndiffを更新。

さらに、int diff変数を削除してください。

diff.tv_sec = finish.tv_sec - start.tv_sec; 
diff.tv_nsec = finish.tv_nsec - start.tv_nsec; 
if (diff.tv_nsec < 0) { 
    diff.tv_sec--; 
    diff.tv_nsec += 1000000000; 
} 

finishstart前に発生し、他のコードは同じ符号でdiffの2人のメンバーを維持することが望ましい場合があるべきです。

+0

同じ結果が得られます。 – user8793

関連する問題