我有一些代码可以将 QueryPerformanceCounter 返回的时间值转换为以毫秒为单位的双精度值,因为这样计算起来更方便。
该函数如下所示:
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:precise) )
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
有谁知道为什么调试器 Watch 中的精度与我的程序中的结果不同?
更新:在进行转换和除法之前,我尝试从 timerPerformanceCounter.QuadPart 中减去 30270310439445,现在它在所有情况下似乎都是准确的。也许我现在只看到这种行为的原因可能是因为我的计算机的正常运行时间现在是 16 天,所以值比我习惯的要大?所以这似乎是一个大数字的划分精度问题,但这仍然不能解释为什么在 Watch 窗口中划分仍然正确。它的结果是否使用比双精度更高的类型?