Berechnung des Osterdatums

Begonnen von hugo, 29. Dezember 2006, 14:55:09

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 8 Gäste betrachten dieses Thema.

hugo

funktion easter(date); berechnet den ostersonntag für ein bestimmtes jahr
die meisten kirchlichen feiertage haben einen festen abstand von ostern

tobias

Zur Berechnung des Datums für den Ostersonntag für ein bestimmtes Jahr gibt es einen einfachen Algorithmus. Da ich keine Entwicklungsumgebung zur ST-Programmierung zur Hand habe stelle ich die Funktion in Java dar. Ich denke, das sollte dann leicht in ST umzuwandeln sein.


/* Die Funktion abstand(int jahr) mit der Rückgabevariable int gibt den Abstand des Ostersonntags vom "0.März" aus gesehen zurück */
public int abstand(int jahr)
{
int k = jahr/100;
int m = 15 + (3*k+3)/4 - (8*k+13)/25;
int s = 2 - (3*k+3)/4;
int a = jahr % 19; // % bezeichnet die Modulo-Funktion
int d = (19*a+m) % 30;
int r = d/29 + d/28 - (d/29)*(a/11);
int og = 21 + d - r;
int sz = 7 - ((jahr+jahr/4+s) % 7);
int oe = 7 - ((og-sz) % 7);

return og + oe; // abstand entspricht og + oe
}


Der frühestmögliche Termin für den Ostersonntag ist der 22. März. Das heißt, dass der Ausgabewert immer größer oder gleich 22 sein muss. Es sollte beachtet werden dass die Divisionen in der obigen Funktion Ganzzahldivisionen sind, welche ein Ganzzahlergebnis zurückliefern. Die Ergebnisse der Divisionen sind also mit der oberen Gaussklammer zu versehen. Java tut dies bei einem Rückgabewert von Typ int automatisch.

Die Javafunktion habe ich getestet und mit richtigen Osterdaten verglichen. Hier eine Liste vorberechneter Osterdaten:
2006     16.04. (Abstand: 47)
2007     08.04. (Abstand: 39)
2008    23.03. (Abstand: 23)
2009    12.04. (Abstand: 43)
2010    04.04. (Abstand: 35)

Ist das Datum des Ostersonntags erst einmal bestimmt, können automatisch Angaben über die folgenden kirchlichen Feiertage gemacht werden:
Ostersonntag - 46 Tage: Aschermittwoch
Ostersonntag + 39 Tage: Christi Himmelfahrt
Ostersonntag + 49 Tage: Pfingstsonntag
Ostersonntag + 60 Tage: Fronleichnam

hugo

#2
Ich habe die Funktion wie folgt implementiert
glaube das ist das gleiche oder?
der algorithmus von gauss braucht viele korrekturen abhaengig vom jahr.

FUNCTION easter : DATE
VAR_INPUT
year : INT;
END_VAR
VAR
A: INT;
B: INT;
C: INT;
D: INT;
e: INT;
f: INT;
g: INT;
h: INT;
i: INT;
k: INT;
l: INT;
m: INT;
n: INT;
o: INT;
J: INT;
END_VAR

(*
version 1.0 27 dec 2006
programmer hugo
tested by tobias

easter calculates the day of easter sunday for a given year.
most other catholic holidays are calculated in reference to easter sunday.

*)

a := year MOD 19;
b := year / 100;
c := year MOD 100;
d := b / 4;
e := b MOD 4;
f := (b + 8) / 25;
g := (b - f + 1) / 3;
h := (19 * a + b - d - g + 15) MOD 30;
i := c / 4;
k := c MOD 4;
l := (32 + 2 * e + 2 * i - h - k) MOD 7;
m := (a + 11 * h + 22 * l) / 451;
n := (h + l - 7 * m + 114) / 31;
o := (h + l - 7 * m + 114) MOD 31;

easter := set_Date(year,n,o+1);

(*
Im Magazin "Nature" vom 20. April 1876 veröffentlichte ein anonymer Autor eine Tabelle mit Regeln zur Berechnung des (Gregorianischen) Ostersonntages des Jahres J. In Formeln ausgedrückt erhält man das Folgende:
a = J mod 19
b = int(J / 100)
c = J mod 100
d = int(b / 4)
e = b mod 4
f = int((b + 8) / 25)
g = int((b - f + 1) / 3
h = (19 ÃÆ'ââ,¬Å¡Ãƒâ€šÃ,· a + b - d - g + 15) mod 30
i = int(c / 4)
k = c mod 4
l = (32 + 2 ÃÆ'ââ,¬Å¡Ãƒâ€šÃ,· e + 2 ÃÆ'ââ,¬Å¡Ãƒâ€šÃ,· i - h - k) mod 7
m = int((a + 11 ÃÆ'ââ,¬Å¡Ãƒâ€šÃ,· h + 22 ÃÆ'ââ,¬Å¡Ãƒâ€šÃ,· l) / 451)
n = int((h + l - 7 ÃÆ'ââ,¬Å¡Ãƒâ€šÃ,· m + 114) / 31)
o = (h + l - 7 ÃÆ'ââ,¬Å¡Ãƒâ€šÃ,· m + 114) mod 31

n ist hierbei die Nummer des Monats, o + 1 die Nummer des Tages auf welchen der Ostersonntag im Jahr J fällt. Dieser Algorithmus kommt ohne Hilfszahlen aus.

*)

hugo

hallo tobias
kannst du mal pruefen ob die beiden algorithmen auch in 100 jahren noch das gleiche liefern.

tobias

Kann ich machen. Code sollte generell zwischen [ code ] *hier steht der Code* [ / code ]-Tags geschrieben werden. Einfach beim Schreiben eines Beitrags auf das #-Symbol klicken, oder schon vorhandenen Code markieren und dann auf das #-Symbol klicken. Zwischen den Code-Tags werden die Smilies u.ä. nicht geparsed.

gravieren

Hi

Zitathallo tobias
kannst du mal pruefen ob die beiden algorithmen auch in 100 jahren noch das gleiche liefern.
Ich würde sagen, 25 Jahre reichen auch.
(Dann bin ich in Rente, kann sich jemand anders mit dem Programm rumschlagen  ;))
(D.h.  Sollte die SPS bis dahin noch laufen )


swmggs

 ;) ;) ;) ;) Na ich wäre da mal mit solchen Aussagen vorsichtig ;) ;) ;)

In 25 Jahren in Rente, wollen wir es hoffen ::) ::) ::) ::)

swmggs

Oberchefe

ZitatIch würde sagen, 25 Jahre reichen auch.
(Dann bin ich in Rente, kann sich jemand anders mit dem Programm rumschlagen  Zwinkernd)
(D.h.  Sollte die SPS bis dahin noch laufen )

Das hatten sich vor Dir auch schon welche gedacht, bekanntermaßen entstand dadurch die Y2K Problematik.

gravieren

Hi  Hugo

ZitatDas hatten sich vor Dir auch schon welche gedacht, bekanntermaßen entstand dadurch die Y2K Problematik.
Einspruch  ::)

Das Problem lag am Speicherspargedanken.   Heute beu 1 GB und mehr Arbeitsspreicher verstehen wird das nicht mehr.


O.K !     Eigentlich hast du mit deiner Aussage recht.   ;)

hugo

keine angst der momentane algorithmus funktioniert mindestens für 250 jahre weiter haben wir nicht getestet.
danach sollte er eigentlich auch noch funktionieren, glaube aber eher das dann oster vielleicht anders abläuft