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....