Your GetTime() method looks suspicious to me. You could be throwing away lots of precision because of the integer divide.
The simplest way to solve that is to make it return a double, and make the program start time come out as zero. Note that float is no good for this - after the program has been running for a while the accuracy will be too low.
// Get current time in seconds
double GetTime()
{
static LARGE_INTEGER frequency = GetFrequency();
LARGE_INTEGER counter;
QueryPerformanceCounter(&counter);
// We want time zero to be when the program starts. I've hacked that in with a static variable here.
static LARGE_INTEGER programStartTime = counter;
return (double)(counter.QuadPart - programStartTime.QuadPart) / (double)frequency.QuadPart;
}