开发者

Can anyone decipher why these two conversions to unsigned long long give different results?

LARGE_INTEGER lpPerformanceCount, lpFrequency;

QueryPerformanceCounter(&lpPerformanceCount);
QueryPerformanceFrequency(&lpFrequency);

(Count.QuadPart is a long long showing a CPU count)

(Freq.QuadPart is a long long showing frequency of Count for a second)

Attempting to print microseconds in real time.

stable output:

printf("%llu\n", ((long double)lpPerformanceCount.QuadPart/ lpFrequency.QuadPart) * 1000000);

erratic output: (result jumps i开发者_JAVA百科ncoherently front and back even if it's at first glance sane)

printf("%llu\n", 1000000 * (lpPerformanceCount.QuadPart / lpFrequency.QuadPart) + (lpPerformanceCount.QuadPart % lpFrequency.QuadPart));

EDIT: printf needed a further (unsigned long long) conversion in its input, the original code had that done by a return value of a func.


Are you sure %llu prints a reasonable double?

lpPerformanceCount.QuadPart / lpFrequency.QuadPart gives you a time, rounded to full seconds.

lpPerformanceCount.QuadPart % lpFrequency.QuadPart gives you a tick count (number ticks since last full second).

Adding a count to a time gives you.. how to put that politely... crap.

I alway use the double arithmetics, much less hassle. However, if you insist in non-FPU code, you could use:

count.QuadPart*1000000 / (freq.QuadPart*1000000)

which would overflow faster (though not a practical problem I'd assume). Fixing that up for integer arithmetics:

count.QuadPart / freq.QuadPart 
+ (count.QuadPart % freq.QuadPart) * 1000000 / freq.QuadPart

(I hope that's right...)


Yes. IIUC, it should be something like:

1000000 * (lpPerformanceCount.QuadPart / lpFrequency.QuadPart) + 
(lpPerformanceCount.QuadPart % lpFrequency.QuadPart) * 1000000 / lpFrequency.QuadPart

or maybe

(lpPerformanceCount.QuadPart / (lpFrequency.QuadPart / 1000000) )

The first will overflow if lpFreuency.QuadPart is high; the second will be inaccurate or even overflow if lpFrequency.QuadPart is low.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜