LARGE_INTEGER lpPerformanceCount, lpFrequency;
QueryPerformanceCounter(&lpPerformanceCount);
QueryPerformanceFrequency(&lpFrequency);
(Count.QuadPart est un long montrant un nombre de CPU)Quelqu'un peut-il déchiffrer pourquoi ces deux conversions à non signé longtemps donner des résultats différents?
(Freq.QuadPart est une fréquence du comte montrant long long pour une seconde)
Toute tentative d'impression microsecondes en temps réel.
sortie stable:
printf("%llu\n", ((long double)lpPerformanceCount.QuadPart/ lpFrequency.QuadPart) * 1000000);
sortie erratique: (résultat des sauts incohérents avant et arrière, même si elle est au premier coup d'œil sain d'esprit)
printf("%llu\n", 1000000 * (lpPerformanceCount.QuadPart/lpFrequency.QuadPart) + (lpPerformanceCount.QuadPart % lpFrequency.QuadPart));
EDIT: printf avait besoin d'un autre (unsigned long long) conversion dans son entrée, le code original avait cela fait par une valeur de retour d'une fonction.
Selon vous, quel est le moyen le plus sûr de les convertir à cette fin? Est unsigned long long var = ((long double) lpPerformanceCount.QuadPart/lpFrequency.QuadPart) * 1000000) le meilleur? (ou avec 1000000ULL) –
Je stocke '1.0/freq.QuadPart' en time-per-tick, et utilise' count.QuadPart * timePerTick' pendant un certain temps (en secondes). Il y a une perte de précision théorique - mais je n'ai jamais vu de valeurs de fréquence qui seraient affectées. – peterchen
Je suppose que c'est à peu près équivalent pour le matériel puisque l'arithmétique à virgule flottante entre en jeu. Merci pour la contribution. –