Zitat von
3_of_8:
Der 0.Januar 1900 ist der 31.Dezember 1899. ;)
Ja, aber das Bezugsdatum von TDateTime ist der
30.Dezember 1899 (nicht der 31.)
Zitat von
3_of_8:
Der Rest ist durchaus interessant, auf Wikipedia steht diese Information nicht (oder ich habe sie mehrfach überlesen).
Wikipedia ist schon eine tolle Sache. Jedoch würde ich das nicht gerade als Referenz betrachten, weil die Beiträge von jedem editiert werden können, also jeder seine persönliche Sicht der Dinge dort verewigen kann. (Leider gibt es so viele Leute die so viele Dinge wissen, die so nicht sind)
Zitat von
3_of_8:
EDIT: Eine Sache passt da nicht so ganz... Wie soll der Double dann die Zahl 0 aufnehmen?
Wenn alle Bits des Exponenten und alle Bits der Mantisse = 0 sind, dann ist die Zahl = 0. Das Vorzeichen Bit entscheidet dann, ob die Zahl +0 oder -0 ist. (Die FPU kennt tatsächlich positive und negative 0.)
Zitat von
3_of_8:
Und ich würde die Zahl 7 eher so darstellen:
1 1100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 * 2^-50
Wäre dann in deiner Darstellung:
Mantisse: (1) 1100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 (erste 1 implizit)
Exponent: 111 1111 1100 1110
Wo ist mein Fehler?
Dein Fehler ist, daß Du davon ausgehst, die Mantisse sei ein simples IntegerFeld.
Stelle Dir die Mantisse so vor, das hinter dem höchsten Bit (das implizit = 1 ist) ein Punkt steht.
Der "Exponent" gibt dann an, um wiewiel Stellen dieser Punkt nach rechts, oder bei negativem Exponenten nach links, verschoben werden muß. Die (nach der Verschiebung) links vom Punkt stehenden Bits bilden dann den Integer-Teil, die rechts vom Punkt stehenden Bits bilden den Nachkomma-Teil.
Beim Exponenten ist noch zu beachten, daß er, wie Intel sagt, "biased" ist. Der wirkliche Exponent ergibt sich aus Exponent minus Bias-Konstante (127 für Singles, 1023 für Doubles, 16383 für Extended).
Zur Darstellung der Zahl 7 :
Code:
0 10000000001 (1).1100000000000000000000000000000000000000000000000000
Also:
Sign = 0
Biased Exponent = 401H = 1025D (biased)
True Exponent = 2
Mantisse nach Verschiebung = (1)11.00000000000000000000000000000000000000000000000000
Und hier nochmal die komplette Definition für Singles, Doubles, Extendeds.
In der Tabelle ist "Integer" das höchste Bit der Mantisse und "Fraction" die auf "Integer" folgenden Bits.
Ein "." bedeutet, daß das vor dem "." stehende Zeichen wiederholt wird, um das Feld zu füllen.
Ein "x" beduetet, daß das betreffende Bit 0 oder 1 sein kann.
@3_of_8:
Ich habe mich bemüht, den folgenden Teil (hoffentlich) korrekt aus den Intel-Specs abzukupfern und zu interpretieren, gib Dir deshalb bitte auch Mühe ihn zu lesen und zu verstehen.
Die Intel-Specs kannst Du Dir hier holen:
Intel Specs
Die Definitionen stehen in "Basic Architecture"
Code:
. Sign Exponent Integer Fraction
---- --------------- ------ --------------
+Unendlich 0 11.11 1 00.00
+Normale Zahlen 0 00.01 bis 11.10 1 00.00 bis 11.11
+Denormale Zahlen 0 00.00 0 00.01 bis 11.11
+0 0 00.00 0 00.00
-------------------------------------------------------------------
-0 1 00.00 0 00.00
-Denormale Zahlen 1 00.00 0 00.01 bis 11.11
-Normal Zahlen 1 00.01 bis 11.10 1 00.00 bis 11.11
-Unendlich 1 11.11 1 00.00
-------------------------------------------------------------------
SNaN x 11.11 1 0x.xx (2)
QNaN x 11.11 1 1x.xx
Indefinite 1 11.11 1 10.00
-------------------------------------------------------------------
Länge der Felder
Single 1 8 1 (1) 23
Double 1 11 1 (1) 52
Extended 1 15 1 63
(1) Bei Singles und Doubles wird das Integer-Bit nicht gespeichert.
Es wird von der FPU implizit angenommen als = 1, außer für die
Zahl 0 und für Denormale Zahlen. Ich vermute, daß der Exponent
ausschlaggebend ist (Exponent=0 : I=0, Exponent<>0 : I=1).
(2) Mindestens 1 Bit (jedoch nicht das höchste) muß = 1 sein
Und hier das ganze noch mal in Textform :
Normale Zahlen sind die Zahlen, bei denen
1) Im Exponenten mindestens 1 Bit = 1
und mindestens 1 Bit = 0 ist.
2) Das Integer-Bit = 1 ist.
DeNormale Zahlen sind die Zahlen, bei denen
1) Der Exponent = 0 ist
2) Das Integer-Bit = 0 ist
3) Die Fraction <> 0 ist
0 Werte sind die Zahlen, bei denen
1) Der Exponent = 0 ist
2) Das Integer-Bit = 0 ist
3) Die Fraction = 0 ist
Unendlich-Werte sind die Zahlen, bei denen
1) Alle Bits des Exponenten = 1 sind
2) Das Integer-Bit = 1 ist
3) Die Fraction = 0 ist
SNaN Werte (="
Signalling
Not a Number") sind die Zahlen, bei denen
1) Alle Bits des Exponenten = 1 sind
2) Das Integer-Bit = 1 ist
3) Das höchste Bit der Fraction = 0 ist.
4) Mindestens 1 Bit der Fraction = 1 ist.
QNaN Werte (="
Quiet
Not a Number") sind die Zahlen, bei denen
1) Alle Bits des Exponenten = 1 sind
2) Das Integer-Bit = 1 ist
3) Das höchste Bit der Fraction = 1 ist.
Der Unterschied zwischen SNaNs und QNaNs ist, daß SNaNs immer eine FPU-
Exception auslösen während QNaNs ohne FPU-
Exception verarbeitet werden. FPU-Operationen, bei denen NaNs beteiligt werden liefern als Resultat immer eine QNaN. SNaNs können von der FPU nicht erzeugt werden, müssen bei Bedarf also per Software generiert werden.