Einzelnen Beitrag anzeigen

Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 
#20

Re: Osterformel nach Computus ecclesiasticus

  Alt 10. Mär 2010, 12:48
Ich habe mir nun ca. 1,5 Stunden die Zeit genommen, zu recherchieren, was es mit dem Code auf sich hat.
Doch überall ist es erforderlich, in einer Tabelle nach zu schauen, bsp. hier.

Ich habe mal versucht, den Code dort umzusetzen und es gibt auch Ähnlichkeiten mit dem Code aus dem C-Buch, aber ganz vollendet bekomme ich den Algorithmus nicht. Und der gleiche Algorithmus ist es wohl auch nicht oder ich habe das Nachschlagen in der Tabelle zu kompliziert umgesetzt.
Das Problem ist nun, dass ich vom berechneten Tag so viele Tage dazu addieren muss, bis man den Sonntag erhält. Nur wie das geht, kriege ich nicht heraus.

Delphi-Quellcode:
function GetEasterDate(Year: Integer): TDate;
var
  Century, GoldenNumber: Integer;
  JulianEpact, GregorianEpact: Integer;
  SolarEquation, LunarEquation: Integer;
  Day, Month: Integer;
begin
  Century := (Year div 100) + 1;
  GoldenNumber := (Year mod 19) + 1;
  JulianEpact := (11 * (GoldenNumber - 1)) mod 30;
  SolarEquation := (3 * Century) div 4;
  LunarEquation := (8 * Century + 5) div 25;
  GregorianEpact := JulianEpact - SolarEquation + LunarEquation + 8;

  while (GregorianEpact > 30) do
    Dec(GregorianEpact, 30);
  while (GregorianEpact < 0) do
    Inc(GregorianEpact, 30);

  // table lookup follows, I hope it's correct

  // month
  if (GregorianEpact < 13) or (GregorianEpact > 23) then
    Month := 4
  else
    Month := 3;

  // day
  if (GregorianEpact < 13) then
    Day := 13 - GregorianEpact
  else if (GregorianEpact < 24) then
    Day := 44 - GregorianEpact
  else if GregorianEpact = 24 then
    Day := 18
  else if GregorianEpact = 25 then
  begin
    if GoldenNumber > 11 then
      Day := 17
    else
      Day := 18;
  end
  // GregorianEpact > 25
  else
    Day := 43 - GregorianEpact;

  // go forward to easter sunday
  // example: if Day is a friday => Inc(Day, 2) to get the sunday
  // but how to do it?

  Result := EncodeDate(Year, Month, Day);
end;
Und der Abschnitt "Isn't there a simpler way to calculate Easter" im verlinkten Dokument scheint einen anderen Algorithmus zu verwenden.

Blöder Algorithmus.
  Mit Zitat antworten Zitat