Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.057 Beiträge
 
Delphi XE2 Professional
 
#5

Re: TDateTime + Mikrosekunden

  Alt 3. Nov 2006, 22:48
Zitat von marabu:
der Datentyp TDateTime arbeitet auf eine halbe Millisekunde genau
Zitat von himitsu:
Im Jahr 1601 (oder so) kommt man auch locker auf 0,1 Millisekunden. und in ein paar hundert Jahren kann man froh sein, wenn man da noch eine Sekunde rausbekommt.
@marabu:
Nein, Du kannst 1/10 Millisekunde problemlos auflösen, jedenfalls im Bereich 01.01.0001 bis 31.12.9999, wobei beide Grenzwerte in der Praxis wohl keine Rolle spielen. Ersterer nicht, weil er vor unserer Datumsrechnung liegt.

@himitsu:
Wie im Kommentar für marabu gesagt, kann man mit TDateTime 1/10000 Sekunden auch im Jahr 9999 korrekt darstellen.

Wie komme ich zu dieser Aussage?:

Ein TDateTime-Wert ist ein Double-Wert, dessen Integer-Teil den laufenden Tag, gezählt ab 30.12.1899 (30.12.1899 = 0) abbildet. Der Nachkommateil gibt die Zeit am betreffenden Tag wieder.
Der 31.12.9999 hätte einen Integer-Teil = 2958465.
Um diesen Wert darzustellen werden 22 Bits der 52-Bit-Mantisse benötigt.
Somit bleiben für den Nachkomma-Teil 30 Bits verfügbar, mit denen 1073741824 unterschiedliche Werte verwaltet werden können. Geteilt durch 86400 (Sekunden/Tag) ergibt das 12427 verschiedene Werte pro Sekunde.
Das ist die Theorie.
Und wie sieht das in der Praxis aus ?:
Für eine Auflösung von 1/10000 s werden für einen Tag 86400*10000 = 864000000 "Einheiten" benötigt.
Wenn man nun den Integerwert eines Doubles auf 2958465 (=31.12.9999) setzt und dann für jede dieser 864000000 "Einheiten" (erfolgreich) prüft, ob es möglich ist, einen TDateTime-Wert zu generieren und anschließend wieder korrekt in Jahr,Monat,Tag, und "Einheit" umzuwandeln, dann kann man TDateTime für eine Auflösung von 1/10000 s verwenden.
Das habe ich geprüft - es funktioniert.

Wenn man allerdings mit solchen Werten rechnen will, kommt es zu Ungenauigkeiten.
Aber das passiert auch bei sehr viel geringeren Auflösungen.

Versuche mal folgendes (zugegebenermaßen etwas extremes Beispiel):

Delphi-Quellcode:
PROCEDURE TMain.Test;
var dt,dt3:TDateTime; i:integer;
begin
   dt:=Date;
   dt3:=1/3;
   for i:=1 to 3000000 do dt:=dt+dt3;
   ShowMessage(DateTimeToStr(dt));
end;
Du wirst sehen, daß da eine Abweichung von 4 s auftritt.

Fazit : Wer mit Zeiten wirklich exakt rechnen will, der sollte sich nicht auf TDateTime verlassen.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat