Frage

Warum ist der Unterschied zwischen zwei time_ts zurückgegeben von der difftime( time_t t1, time_t t2) methode als double?Ich sehe nicht, woher die Präzisionsanforderung kommt.

War es hilfreich?

Lösung

Da time_t ist in der Norm einfach definiert als ein arithmetic type capable of representing times.

Das ist ungefähr alles, was es darüber aussagt.Es muss keine Ganzzahl sein, es muss keine Sekunden darstellen.Es kann immer nur ein Vielfaches von zehn sein oder es kann sich um einen Gleitkommatyp handeln, der Zeiten bis zu einer Auflösung von 10 darstellen kann-43 Sekundenschnelle.

Das Zitat von C99 7.23.1 Components of time ist (leicht umschrieben):

Deklarierte Typen sind clock_t und time_t, die arithmetische Typen sind, die Zeiten darstellen können.Der Bereich und die Genauigkeit der in clock_t und time_t darstellbaren Zeiten sind implementierungsdefiniert.

Daher Leute, die blind den Zeitunterschied mit ausrechnen:

delta = time_end - time_begin;

möglicherweise stellen Sie fest, dass ihr Code nicht auf allen Plattformen funktioniert.

Jetzt kenne ich keine Plattformen mehr, auf denen es seit der Epoche keine einfachen Sekunden mehr gibt, aber ich wurde von Annahmen gebissen wie dies vorher, wie angenommen A durch Z sind zusammenhängend, während dies in der Tat nicht erforderlich ist und bei Mainframe-Produkten, die EBCDIC verwenden, nicht so gut funktioniert.Und ja, sie sind noch in schwer verwendung, obwohl sie anscheinend seit den 60er Jahren im Sterben liegt :-)

Das C99-Begründungsdokument hat Folgendes zu sagen:

Art clock_t und time_t sind arithmetisch, weil Werte dieser Art nach bisheriger Praxis gelegentlich mit -1 verglichen werden müssen (eine "Weiß nicht" -Angabe), geeignet gegossen.

Der Standard definiert jedoch keine arithmetischen Eigenschaften dieser Typen, um Implementierungen die maximale Flexibilität bei der Auswahl von Bereichen, Genauigkeiten und Darstellungen zu ermöglichen, die für ihre beabsichtigte Anwendung am besten geeignet sind.Die Darstellung muss keine Zählung einer Grundeinheit sein;es ist denkbar, dass eine Implementierung verschiedene Komponenten eines zeitlichen Werts als Unterfelder eines ganzzahligen Typs darstellt.

Andere Tipps

Obwohl allgemein als integraler Typ gedacht — und implementiert -, der Sekunden seit Beginn einer Epoche darstellt, time_t ist eigentlich nicht formal als solches definiert, so dass Sie das Ergebnis von difftime nicht portabel verwenden könnten, wenn es ein wäre time_t.Wie für andere Alternativen: int ist unter Umständen zu klein (wie es ist long) und long long ist nicht tragbar.

Wahrscheinlich, weil es der allgemeinste arithmetische Typ ist.Und es erlaubt eine bessere Genauigkeit als die zweite, wenn der Basiswert time_t unterstützt es.

Der Grund dafür ist, dass für den Typ keine arithmetischen Operationen definiert sind time_t, wenn Sie ein double zurückgeben, bedeutet dies, dass Sie das Ergebnis in Berechnungen verwenden können.

IOW, wenn du zwei hinzufügst time_t werte miteinander befinden Sie sich in unsicherem Gebiet, da sich ein anderes Verhalten ergeben kann, wenn time_t als unsigned int oder normal int definiert ist - abhängig von Ihrer Plattform.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top