Einzelnen Beitrag anzeigen

Amateurprofi

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

Re: TDateTime + Mikrosekunden

  Alt 6. Nov 2006, 04:50
Zitat von 3_of_8:
TDateTime ist ein Double-Typ, er besitzt eine Mantisse von 52 Bit. Dies bedeutet, er rechnet mit 52 Binärstellen, kann also maximal 2^52=4503599627370396 Mantissen darstellen.

Dies macht 15-16 Dezimalstellen, das bedeutet eine Genauigkeit auf die Mikrosekunde kann nur eingehalten werden, bis seit dem Bezugsdatum (0. Januar 1900) 2^52=4503599627370396 Mikrosekunden vergangen sind.

4503599627370396µs=4503599627370,396ms=4503599627, 370396s=52124d=142,7y

Also dürfte die Genauigkeit auf Mikrosekunde bis 17. September 2042 aufrecht erhalten bleiben.

(Wenn ich mich nicht verrechnet/verdacht habe)
@3_of_8:

Im Prinzip ist das schon richtig, jedoch
1) Das Bezugsdatum bei TDateTime ist der 30.12.1899
2) Ein Double hat eine 53 Bit Mantisse, nicht 52 Bit.
Letzteres weiß ich auch erst seit heute - und ich denke das ist auch für diverse andere User eine Überraschung.

Wie funktioniert das, wenn 1 Bit fürs Vorzeichen, 11 Bits für den Exponenten und 53 Bits für die Mantisse, ingesamt also 65 Bits in 64 Bits untergebracht werden?:

Ganz einfach :
Anders als bei Extended-Werten, wird das höchste Bit der Mantisse bei Double und bei Single nicht gespeichert sondern implizit als = 1 angenommen (außer natürlich, wenn die Zahl 0 ist).

Zum Beispiel die Zahl 7 sieht, binär dargestellt, so aus
Code:
.       Sign Exponent       Mantisse
Double   0   10000000001     1100000000000000000000000000000000000000000000000000
Extended 0   100000000000001 1110000000000000000000000000000000000000000000000000000000000000
Auf Basis 53 Bit Mantisse habe ich mal zusammen gestellt für welche Zeiträume welche maximale Genauigkeiten erwartet werden können.
In unten stehender Tabelle bedeutet
FBits : Die Anzahl Bits, die für die Zeitangabe, also den Nachkomma-Teil benötigt werden.
IBits : Die Anzahl Bits, die für den Integerteil zur Verfügung stehen (=53-FBits).
Aus IBits habe ich dann die größte Zahl, die mit soviel Bits dargestellt werden kann, abgeleitet und hieraus das Von-Datum und das Bis-Datum. Die Datumsangaben habe ich auf min 01.01.0001 und max 31.12.9999 begrenzt.
Ob es in der Praxis tatsächlich funktioniert, alle möglichen Werte zu Codieren und beim Decodieren wieder auf den jeweiligen Ausgangswert zu kommen, habe ich nur für Millisekunden/10 geprüft.

Code:
Genauigkeit       Fbits IBits Von        Bis
Sekunden          17     36     01.01.0001  31.12.9999
Sekunden/10        20     33     01.01.0001  31.12.9999
Sekunden/100       24     29     01.01.0001  31.12.9999
MilliSekunden     27     26     01.01.0001  31.12.9999
MilliSekunden/10   30     23     01.01.0001  31.12.9999
MilliSekunden/100  34     19     18.07.0464  12.06.3335
MikroSekunden     37     16     26.07.1720  04.06.2079
MikroSekunden/10   40     13     27.07.1877  04.06.1922
MikroSekunden/100  43     10     12.03.1897  19.10.1902
NanoSekunden      47      6     28.10.1899  03.03.1900
NanoSekunden/10    50      3     23.12.1899  06.01.1900
NanoSekunden/100   53      0     30.12.1899  30.12.1899
Tja, jetzt ist es 04:47 Uhr und schlafen fällt heute aus....
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat