Rechenduden und das Schaltjahr Die Gaußsche-Kalenderformel
Welcher Wochentag ist denn der 1. März 2000? - Warum
die Formel versagt!
Warum es Probleme mit 2-stelligem Jahrhundert gibt
-
- Für Interessierte eine Auszug aus dem Rechenduden:
-
- "... Durch die rückläufige Bewegung des Frühlingspunktes in der Ekliptik ist das
tropische Jahr etwas kürzer als das siderische Jahr, es hat 365,2422 mittlere
Sonntentage. Für unsere bürgerliche Zeitrechnung wurde durch die gregorianische
Kalenderreform (1582) die Länge des Jahres auf 365,24525 mittlere Sonnentage festgelegt.
Der Ausgleich der Tagesbruchteile erfolgt durch Einschieben von Schalttagen. Schalttage
sind solche, deren Jahreszahl durch 4 teilbar ist; z.B. 1956, 1960, 1964. Diese Regel
beseitigt den Fehler gegenüber der wahren Länge des tropischen Jahres nicht restlos.
Dies wird erst durch die Bestimmung erreicht, daß alle 400 Jahre drei Schaltjahre
auszufallen haben, und zwar die Schalttage der Säkularjahre, deren Einheit nicht durch 4
teilbar ist, also die Jahre 1700, 1800, 1900 sind keine Schaltjahre. Das Jahr 2000 ist
wieder ein Schaltjahr. Auch mit dieser Schaltregel sind noch nicht alle Abweichungen
beseitigt, aber die verbleibenden Fehlerreste wachsen erst in 3333 Jahren auf einen Tag
an. ..."
Was heißt denn das?
Das Jahr 2000 ist ausnahmsweise ein Schaltjahr.
Ach so! Und weiter?
Die Gaußsche Kalenderformel
Die Kalenderformel liefert die Grundlage zur Ermittlung des Wochentages eines
beliebigen Datums in zwei Rechenschritten:
Erster Rechenschritt:
ZE = int(2,6 * Monat - 0,2) + Tag + Jahr + int(Jahr / 4) + int(Jahrhundert / 4) - 2 *
Jahrhundert
ZE bedeutet Zwischenergebnis.
Monat ist selbsterklärend, wobei März der erste Monat des aktuellen Jahres ist.
(Januar und Februar zählen also als 11. und 12. Monat im vergangenen Jahr!).
Tag ist selbsterklärend.
Jahr, Jahrhundert sind 2-stellig
(int() ist die Integer-Funktion, die ganze postive Zahl ohne Nachkommastellen wird
ermittelt)
Zweiter Rechenschritt: mit Zwischenergebnis den Wochentag berechnen:
ZE mod 7 -> ergibt den Wochentag, wobei Sonntag=0, Montag=1 usw.)
(mod=Modulo-Funktion, d.h. der ganzahlige positive Rest bei Division)
Beispiel: 29.2.2000
Zwischenergebnis berechnen
ZE = int(2,6 * 12 - 0,2) + 29 + 99 + int(99/ 4) + int (19 / 4) - 2 * 19
ZE = 31 + 29 + 99 + 24 + 4 - 38 = 149
Wochentag berechnen
149 mod 7 = 2 (also Dienstag)
Problem 1. März 2000
Am 1. März 2000 liefert die Gaußsche Kalenderformel als Zwischenergebnis zum ersten
Mal seit Computer "denken" einen Minuswert von -32.
Zwischenergebnis berechnen
ZE = int(2,6 * 1 - 0,2) + 1 + 0 + int(0 / 4) + int (20 / 4) - 2 * 20
ZE = 2 + 1 + 0 + 0 + 5 - 40 = -32
In einigen Fällen wurde die Modulo-Funktion nicht korrekt implementiert und liefert in
Wirklichkeit den Absolutbetrag vom Divisionsrest.
Dadurch wird der Wochentag falsch berechnet:
-32 mod 7 = 4 (->Donnerstag)
Die Modulo-Funktion ist jedoch definiert mit:
a mod b = a - (b * int(a/b))
Zu beachten ist ebenso das die Funktion int() nicht den ganzzahligen Anteil ihres Operanden
liefert, sondern die größte Ganze Zahl, die kleiner als der Operand oder gleich dem Operanden ist.
Korrekt sieht die Beispielrechnung also so aus:
-32 mod 7 = -32 - (7 * int(-32/7))
= -32 - (7 * int (-4,57))
= -32 - (7 * -5)
= -32 + 35
= 3
Hier ist das Ergebnis korrekt: der 1.3.2000 ist ein Mittwoch.
Nicht Herr Gauß trägt also Schuld an Problemen mit seiner Kalenderformel, sondern deren
Umsetzung auf die heutige Technik ist mitunter fehlerbehaftet.
Problem: Das Programm führt Jahreszahl nur
2-stellig, Jahrhundert wird mit "19" ergänzt:
Wiederum das Beispiel: 29.2.2000
29.2.00, wird ergänzt zu 29.2.1900 - Zwischenergebnis:
ZE = int(2,6 * 12 - 0,2) + 29 + 99 + int(99 / 4) + int (18 / 4) - 2 * 18
ZE = 31 + 29 + 99 + 24 + 4 - 36 = 151
Wochentag berechnen
151 mod 7 = 4 (also Donnerstag)
|