Question

Pourquoi la différence entre deux time_test retourné par le difftime( time_t t1, time_t t2) méthode comme double?Je ne vois pas d'où vient l'exigence de précision.

Était-ce utile?

La solution

Parce que time_t est simplement défini dans la norme comme un arithmetic type capable of representing times.

C'est à peu près tout ce qu'il en dit.Il n’est pas nécessaire que ce soit un nombre entier, il n’est pas nécessaire qu’il représente des secondes.Il ne peut s'agir que d'un multiple de dix ou d'un type à virgule flottante capable de représenter des temps jusqu'à une résolution de 10.-43 secondes.

La citation de C99 7.23.1 Components of time est (légèrement paraphrasé):

Les types déclarés sont clock_t et time_t, qui sont des types arithmétiques capables de représenter des temps.La plage et la précision des heures représentables dans clock_t et time_t sont définies par l'implémentation.

D’où les gens qui calculent aveuglément le décalage horaire avec :

delta = time_end - time_begin;

peuvent constater que leur code ne fonctionne pas sur toutes les plateformes.

Maintenant, je ne connais pas de mémoire de plate-forme où il ne s'est pas écoulé quelques secondes depuis l'époque, mais j'ai été mordu par des hypothèses. comme cela avant, comme supposer A à travers Z sont contigus alors qu'en fait, cela n'est pas obligatoire et ne fonctionne pas très bien sur les produits mainframe qui utilisent EBCDIC.Et oui, ils sont toujours dans lourd utiliser malgré le fait qu'il soit apparemment mourant depuis les années 60 :-)

Le document de justification du C99 dit ceci :

Les genres clock_t et time_t sont arithmétiques car les valeurs de ce type doivent, conformément à la pratique existante, être parfois comparées à -1 (une indication "ne sait pas"), convenablement exprimées.

Aucune propriété arithmétique de ces types n'est cependant définie par la norme, afin de permettre aux implémentations une flexibilité maximale dans le choix des plages, des précisions et des représentations les plus appropriées à leur application prévue.La représentation n'a pas besoin d'être le décompte d'une unité de base ;une implémentation pourrait éventuellement représenter différentes composantes d'une valeur temporelle sous forme de sous-champs d'un type entier.

Autres conseils

Bien qu'il soit universellement considéré - et mis en œuvre - comme un type intégral représentant les secondes depuis le début d'une époque, time_t n'est pas réellement défini formellement en tant que tel, vous ne pouvez donc pas utiliser de manière portable le résultat de difftime s'il s'agissait d'un time_t.Quant aux autres alternatives : int est trop petit dans certaines circonstances (comme c'est le cas long) et long long n'est pas portable.

Probablement parce que c’est le type arithmétique le plus général.Et cela permet une précision supérieure à la seconde si le sous-jacent time_t le soutient.

La raison en est qu'aucune opération arithmétique n'est définie pour le type time_t, en renvoyant un double, cela implique que vous pouvez utiliser le résultat dans les calculs.

IOW si vous en ajoutez deux time_t valeurs les unes avec les autres, vous êtes en territoire dangereux car un comportement différent pourrait résulter si time_t est défini comme un entier non signé ou un entier normal - en fonction de votre plate-forme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top