2011-06-17 10 views
0

私はGetTimeヘルパ関数を実装しようとしています。カウントで計測された現在の時刻が取得され、システムの1秒あたりのカウント数が取得されるため、現在の時刻をその関係で秒単位で取得できます。これらのタイムカウンタリファインメントステートメントの目的は何ですか?

しかし、その後、実際には得られない改善コードがいくつかあります。なぜそこに最後の2つのステートメントですか?

double GetTime() 
{ 

// Current time value, measured in counts 
__int64 timeInCounts; 
QueryPerformanceCounter((LARGE_INTEGER *)(&timeInCounts)); 

// To get the frequency (counts per second) of the performance timer 
__int64 countsPerSecond; 
QueryPerformanceFrequency((LARGE_INTEGER *)(&countsPerSecond)); 

double r, r0, r1; 

// Get the time in seconds with the following relation 
r0 = double (timeInCounts/countsPerSecond); 

// There is some kind of acuracy improvement here 
r1 = (timeInCounts - ((timeInCounts/countsPerSecond)*countsPerSecond)) 
       /(double)(countsPerSecond); 

r = r0 + r1; 

return r; 
} 

答えて

0

これが宿題の場合は、実際に宿題タグを付けてください。

デバッガでプログラムを実行し、値r0とr1を調べます(またはprintfを使用します)。一度それらの値を見ると、2つの計算が何をしているのかは明らかです。

編集6/18

のはcountsPerSecondが値5とtimeInCounts計算17でありtimeInCounts/countsPerSecondので、結果も__int64になります別の__int64で1 __int64を分割しましょう、単純な計算を維持します。 17を5で割ると結果3が得られ、次にdoubleにキャストされるので、r0は値3.0に設定されます。

計算は(timeInCounts/countsPerSecond)*countsPerSecondたちに、整数値2が整数値5で割った場合、我々はゼロになるだろう。2.

たちに値を与えるtimeInCountsから減算される値15を与えます。 ただし、の場合、除数はdoubleにキャストされるため、整数値2はdouble値5.0で除算されます。これは我々に二重の結果を与えるので、r1は0.4に設定されます。

最後にr0とr1を加算して、最終結果3.4を得る。

+0

こんにちは、r0はちょうど秒単位の時間ですが、式を単純化するとr1は常に0になるはずですが、そうではありません。なぜそれが計算されているのか、それがなぜそこになければならないのか分かりません。私はそれがいくつかの精度向上と一緒にいなければならないと思うが、私はそれが何をしているかは言えなかった。 – Shomismo

+0

'r1'の値を調べると、0より大きく1より小さい値があることがわかります。 'countsPerSecond'は' double'にキャストされるので、 'r1'は整数除算の結果ではありません。 –

+0

そうです。あなたはそうすることで、より鋭い結果を得ますか? r0計算よりも正確ですか(それもドブルとしてキャストされます)? – Shomismo

関連する問題