Hallo Wolfgang
Es tut mir leid, aber hier stimmt etwas nicht...
Es werden bestimmt keine Kommastellen im Speicher verwendet!
Das würde ja bedeuten, dass eine FLOAT bez. REAL in Anwendung wäre.
Nein, DOUBLE.
Das
jedoch wäre mit der erheblichen Tatsache verbunden, dass je nach
rechen-Operanden enorme Abweichungen der tatsächlichen Zeit resultieren
würden.
=> https://de.wikipedia.org/wiki/Gleitkommazahl
/ Eigenschaften einer Gleitkommaarithmetik
Ja, tut es; und ja, in der Tat, Rundungsfehler können im Extremfall bis
in den Nanosekundenbereich druchschlagen.
TIME wird in Millisekunden in INT hinterlegt, darum auch der beschränkte
Umfang von ~±596 Std.
Ich habe keine Ahnung, von welchem Programm du redest, von Calc
jedenfalls nicht; da gibt es überhaupt keinen Variablentyp TIME o. ä.
Und auch in Base aka der Makrosprache gibt es das nicht, höchstens die
/Funktion/ TIME; den Variablentyp /DATE/.
(das reicht nicht mal für einen Monat ~720h, aber für ms-genaue
Wochenuhren und Funktion-Timer prädestiniert)
Zeit und Datum DATE_AND_TIME werden daher im Speicher immer Binär in
Anzahl Sekunden ab Fixpunkt hinterlegt.
*Alle* Daten, sogar Texte, werden intern binär abgelegt. Und Calc selbst
kennt überhaupt nur 3 Datentypen, nämlich String aka Text, Integer und
Gleitkomma aka Double.
Jep,
aber nur bedingt richtig "Wahrheitswert" (BOOL) hast Du unterschlagen...
und String ist in sich kein echter Datentyp sondern ein eindimensionales
ARRAY zu 8Bit.
Wenn das, was Du hier sagst richtig ist; das die Zeiten in Calc in
Fliesskomma-Werten hinterlegt sind; dann werden bei gewissen
Rechenoperationen unweigerlich Fehler auftrete.
Nicht gerade das Gesuchte. In INT würde solches nie auftreten. Auf
Leitsystemen mit Echtzeiteinträgen ist es Bedingung, dass die
Zeitstempel kohärent sind!
Gerade beim Abgleich von Letzt-wert, was in Leitebene als Bedingung für
die Neuwert-Gültigkeit steht (DCP/IP Daten-Überholungen), eine absolute
Bedingung.
Somit kommt Calc als Tabelle für Datenhinterlegung für diesen Zweck
nicht in Frage!
Bei 32Bit DINT
Was bitte ist ein DINT? Meinst du etwa LONG?
Es ist mir sehr wohl bewusst, dass heute oft nur INT geschrieben wird,
obwohl es eigentlich einen grösseren Bereich umfasst. Da kommt daher,
dass auf einem Rechner die Grösse durch einen 16er-, 32er- oder
64er-BitProzessor festgelegt wird. So bezieht sich der Begriff INT heute
zumeist auf die Maximal-Bit-zahl der Recheneinheit.
Meine Aussagen beruhen aber auf den Standard von den grundsätzlichen
ANY_INT Datentypen.
SINT = ShortInteger 8Bit = 1 BYTE (in C CHAR ) -128...127 / 255
INT = Integer 16Bit= 2 BYTE -32768...32767
DINT = DoubleInteger 32Bit= 4 BYTE
LINT = LongInteger 64Bit= 8 BYTE
Die Aufgliederung in BYTE ist darum zu berücksichtigen, weil die meisten
seriellen Transportmittel; CAN, PROFIBUS, MODBUS, Ethernet; Byte-weise
übertragen und die Speicher in Byte organisiert sind!
Darum wird der Speicher in Byte-Grösse definiert und bei der
Speicher-übertragung muss ja auch ein Pointer gesetzt werden, welcher
auf die erste Byte-Adresse zeigt.
Mit Vorstellung "U= für unsigned
in Abwandlung ohne Negativwerte dafür doppelten Umfang
(Höchstwertigels Bit wird nicht als Negativ sondern als Zahlenwert genutzt)
Demselben Muster folgt auch ANY_REAL
REAL = 32Bit
LREAL= 64Bit
ergibt das einen Umfang von ± ~68 Jahren vom gesetzten
Bei einem DOUBLE ergibt sich ein Wertebereich von rund 4,93E+305 Jahren.
Zum Vergleich, das Universum ist überhaupt erst ca. 1,37E+010 Jahre alt.
Der Wertebereich reicht also durchaus noch ein paar Monate. Aber ja, mit
Werten größer/kleiner ca. +/- 1,80E+308 kann Calc nicht mehr rechnen.
Die Rechnung an sich ist trivial:
1Min = 60 Sek
1Std = 60 Min Bez. 3600Sek.
Tag = 60*60*24 = 86400 Sekunden.
Somit können Zeiten Addiert, Subtrahiert u. u. u. werden ohne dass
spezielle Interpretationen benötigt werden.
Im Prinzip ist deine Schlussfolgerung schon richtig. Aber sie gilt
natürlich genauso, wenn 1 Sekunde als 1/86400 Tag aka
0,00001157407407407410 Tage repräsentiert wird. 2 Sekunden ist in beiden
Fällen das doppelte, 86400 Sekunden ist in beiden Fällen das
86400-fache, usw.; völlig problemlos, und ohne spezielle
Interpretationen. Das würde sogar funktioneren, wenn du den Wert Pi für
1 Sekunde (oder 1 Tag, 1 Woche, 1 Jahr, 1 Millisekunde, oder sonst was,
sogar mit sieben drittel Stunden, oder fünfundzwanzig
siebenunddreißigstel Wochen, usw.) an nimmst.
Da eine INT Zeit die in INT dividiert wird ohne Rest zurückgegeben wird
(keine Rundung) kann diese direkt z.B. mit 60 geteilt werden und ich
erhalte die Zeit in Minuten - u.s.w.
Und was bitte machst du mit Millisekunden usw.?
Solches macht der Zeitinterpreter.
Die richtige Reihenfolge für ein Datum ist:
Jahr.Monat.Tag.Stunde:Minute:Sekunde,Millisekunde
Daraus ergibt sich eine absteigende Rechen-Reihenfolge von der grössten
Einheit "Jahr" zur kleinsten "Sekunde", Rest "Millisekunde"
Zeitwert / 1 Jahr = Jahre
(Zeitwert - Jahre)/ 1 Tag = Tage
(Zeitwert - Jahre - Tage) / 1 Stunde = Stunden
(Zeitwert - Jahre - Tage - Stunden) / 1 Minute = Minuten
...
Die Millisekunden findest Du im Rest nach der Sekundendivision durch
Subtraktion aller vorherigen Werte.
Solches ist in der Regel schon in der Alu hinterlegt; kommt hier auf die
Hardware an = BIOS / Firmware je nach Hersteller...
Wie das genau in Calc abgebildet ist weiss ich nun tatsächlich nicht.
Soweit mir bekannt ist Calc jedoch in "C" programmiert und dürfte daher
die ALU für die Interpretation nutzen. Natürlich können Algorithmen auch
diskret aus-programmiert und andere Wege genutzt sein. Das Scheint mir
hier sogar so zu sein, da ja diese Doppeldeutigkeit von "M" für Monat
und Minute in Calc existiert!
ps. Nanosekunden sind nicht im Umfang von Zeitstempeln. Müssen solche
verarbeitet werden; in Calc kaum möglich; muss dafür ein Interrupt
genutzt werden, da die Prozessorleistung solches sonst nicht abgreifen
kann.
Im Maschinenbau kommt solches z.B. bei Inkrementalgeber vor und bedingt
eine entsprechende Hardwarestruktur und eine Firmware die Interrupt-
Funktionen zur Verfügung stellt.
Der wer? Meinst du etwa das Teil, mit dem eine Zeitreisemaschine
gesteuert wird?
Wolfgang
Schönen Tag
Marino