不正確な部門のdouble(Visual C++2008)
質問
しているのか教えてくださいコードに変換するには時間的価値から返されたQueryPerformanceCounterるdouble値をミリ秒単位で、この利便性をカウントです。
この機能は以下のようなものです:
double timeGetExactTime() {
LARGE_INTEGER timerPerformanceCounter, timerPerformanceFrequency;
QueryPerformanceCounter(&timerPerformanceCounter);
if (QueryPerformanceFrequency(&timerPerformanceFrequency)) {
return (double)timerPerformanceCounter.QuadPart / (((double)timerPerformanceFrequency.QuadPart) / 1000.0);
}
return 0.0;
}
の問題なんて思ったこの問題を前に、変更されましたがありましたので、以下の通りの結果ではないしまいます。の結果が含まれていない部で"年"、小数部で"でも以下の1ミリ秒
入口や階段に入れないの表現にはデバッガ、その結果として正確などを参考にして設定した。
理解しているダブルとはできない、精度の64ビット整数型が、この時、PerformanceCounterのみ必要46ビット(ダブルできる店52ビットを失うことなく) またそうで奇数のデバッガが使用する別のファイル形式にしたい。
ここでは結果します。このプログラム作成にはデバッグモードでは、浮動小数点モードで、C++オプションに設定したデフォルトの精密(/fp:精密))
timerPerformanceCounter.QuadPart: 30270310439445
timerPerformanceFrequency.QuadPart: 14318180
double perfCounter = (double)timerPerformanceCounter.QuadPart;
30270310439445.000
double perfFrequency = (((double)timerPerformanceFrequency.QuadPart) / 1000.0);
14318.179687500000
double result = perfCounter / perfFrequency;
2114117248.0000000
return (double)timerPerformanceCounter.QuadPart / (((double)timerPerformanceFrequency.QuadPart) / 1000.0);
2114117248.0000000
Result with same expression in debugger:
2114117188.0396111
Result of perfTimerCount / perfTimerFreq in debugger:
2114117234.1810646
Result of 30270310439445 / 14318180 in calculator:
2114117188.0396111796331656677036
なんだろうけど、日本人の精度の違いについてのデバッガの時計との比較の結果、私のプログラム?
更新:また控除30270310439445からtimerPerformanceCounter.QuadPart前に変換部門では見を正確にすべての場合です。(粉を山にして真ん中をたいへんお世話になりました。だ見てこの動作は今も私のコンピューターの稼動率は現在16日、その価値がより大きくなりましたね。いずれの部門の精度の問題が多いものの、未だにしない理由の説明当部門はまだ正しい手の届く時計づくりをウインドウです。な利用により高精度タイプよりダブルルまでの成果は?
解決 2
り、小数倍という解決策です。のためにいまは、少し異なるアプローチし、作品も、少なくとも私のプログラムを起動していない、もしくは起動以上週にせずに電源を再投入してください。私は覚えておいてください、性能カウンター自分のプログラムを開始し、差し引から現在のカウンタ変換前にダブルを行っています。
なんなのかあるいは最速ないといけないと思い、思いのベンチマークとします。
bool perfTimerInitialized = false;
double timerPerformanceFrequencyDbl;
LARGE_INTEGER timerPerformanceFrequency;
LARGE_INTEGER timerPerformanceCounterStart;
double timeGetExactTime()
{
if (!perfTimerInitialized) {
QueryPerformanceFrequency(&timerPerformanceFrequency);
timerPerformanceFrequencyDbl = ((double)timerPerformanceFrequency.QuadPart) / 1000.0;
QueryPerformanceCounter(&timerPerformanceCounterStart);
perfTimerInitialized = true;
}
LARGE_INTEGER timerPerformanceCounter;
if (QueryPerformanceCounter(&timerPerformanceCounter)) {
timerPerformanceCounter.QuadPart -= timerPerformanceCounterStart.QuadPart;
return ((double)timerPerformanceCounter.QuadPart) / timerPerformanceFrequencyDbl;
}
return (double)timeGetTime();
}
他のヒント
Adion,
いのパフォーマンス、キャストにおQuadPart数小数点でのダブル前ます。そしてキャストの数を返しまいます。
しかし、サイズいたします。ですの精度の浮動小数点計算が使えます。
についてこのよだから、
どのコンピュータ科学者にとって知っておくべきこ浮動小数点演算 http://docs.sun.com/source/806-3568/ncg_goldberg.html