Am 28.12.2019 um 17:22 schrieb Marino Salvalaggio:
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.
Bei 32Bit DINT
Was bitte ist ein DINT? Meinst du etwa LONG?
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.
Der wer? Meinst du etwa das Teil, mit dem eine Zeitreisemaschine
gesteuert wird?
Wolfgang