JD(2010,3,25,16,30,0) sollte den 25. März 2010, 16:30:00 Uhr darstellen.
Meine Berechnung gibt aus: 2.455.296,5
Es sollte herauskommen: 2.455.281
Sieht jemand einen Fehler ?
JD = Int(365,25*(Y+4716)) + Int(30,6001*(M+1)) + D + H + B - 1524,5
return(((int)(365.25*(jahr_n+4716))) + ((int)(30.6001*(monat_n+1))) +
tag_n + stunde_n + B - 1524.5);
In deinem C Code kommt H nicht vor, dafür aber stunde_n
Karl heinz Buchegger schrieb:> Der Klassiker>> sekunde_n/86400
Klar ist das H schon mal 0 ist (wenn stunde_n [0..23]). Also richtig
cast anwenden.
der fehler ist da:
Lehrmann Michael schrieb:> return(((int)(365.25*(jahr_n+4716))) + ((int)(30.6001*(monat_n+1))) + tag_n +
stunde_n + B - 1524.5);
aber die Formael sagt:
JD = Int(365,25*(Y+4716)) + Int(30,6001*(M+1)) + D + H + B - 1524,5
ersetze stunde_n durch H und beachte die Anmerkung von Karl heinz
double geht für sekunden_n - aber wenn eines von beiden double ist (in
diesem fall die sekunden_n dann ist das Ergebnis vom Typ der
höchstwertige (also double).
H ist auch ein double wenn ich einen printf("%lf",H); mache!
Die Frage ist, ob die der Integer Sekunden ERST durch den 86400 Integer
geteilt werden (dann ist das Ergebnis IMMER 0) oder ob sie ERST auf den
double gecastet und DANACH geteilt werden, NUR dann bleibt nämlich von
den Sekunden ein Wert zwischen 0 und 1 übrig.
Diese Frage betrifft die ganze Kette, die zum H führt.
Nee, das, was ich meinte, steht da nicht!
Dein Test hat es für Deinen Programmierfall ergeben und mich aufgeklärt,
ok.
Aber da Du meinst, dass das da, was ich wissen wollte, da steht, obwohl
es da nicht steht, solltest Du Dich vielleicht mal allgemein mit der
Priorität von Operatoren befassen. Also die Frage von Punktrechnung vor
Strichrechnung, aber ausgedehnt auf alle Operatoren. Da kommt's nämlich
wirklich auf die Feinheiten an, weil man sonst fiese Fehler übersehen
könnte.
Da jetzt die Konstanten mit Sicherheit double sind, bleibt nichts
anderes übrig als die Divisionen auch als Gleitkommadivisionenen
auszuführen.
Und übersichtlicher ist es IMHO auch.
> Bis auf die Nachkommastelle stimmt's jetzt ...
Kannst du das einmal näher beziffern?
Da der Nachkommaanteil im julianischen Datum die Tageszeit kodiert, kann
eine Angabe von
JD(2010,3,25,16,30,0) sollte den 25. März 2010, 16:30:00 Uhr darstellen.
kein julianisches Datum mit einem Nachkommaanteil von .0 ergeben.
xxx.0 wäre Mittag. Halb 5 Uhr Nachmittags ist ein bischen mehr als ein
Sechstel Tag. Deine Nachkommastelle müsste also ein wenig größer als
xxx.1666 sein
(Das ist ganz klar ein Fehler in Wikipedia. Ich hab ihn korrigiert.
Hätte dir eigentlich auch auffallen müssen :-)
(Und bitte: gewöhn dir den Unsinn mit den Tausenderpunkten wieder ab.
Die Verwechslungsgefahr mit einem Dezimalpunkt ist einfach viel zu groß!
Kaufleute brauchen diese Punkte, Techniker benutzen im Zweifelsfall
Exponenten oder schreiben die Zahl einfach so hin)