abrunden| casten| julianisches datum berechnen
-
heyho ich habe ein banales problem...denke ich
und zwar will in meiner berechnung der nachkommateil nicht funktionieren...
probleme macht mir der term temp3...er stimmt zwar werte mäßig lässt sich aber nicht richtig mit den anderen beiden temp1 und temp2 verrechnen...
ich vermute das liegt daran das ich in temp1 und 2 wild rumgecastet habe...nur weiß ich nicth wie ich anders abrunden könntemain() { float jd, h ; float jahr, monat, tag, stunde, minute, sekunde; float b, a; float temp1, temp2, temp3; jahr = 1582; monat= 10; tag = 15; stunde = 0; minute = 0 ; sekunde = 0; h = (stunde/24) + (minute/1440) + (sekunde/86400); a = (int)jahr/100; b = (2-a) + ((int)(a/4)); temp1 = (365.25*(jahr+4716)); temp2 = (int)(30.6001*(monat+1)); temp3 = tag + h + b - 1524.5; jd = temp1 + temp2 + temp3; printf("\n\n %7.5f\n",jd); getch(); }
-
main() { double jd, h ; double jahr, monat, tag, stunde, minute, sekunde; double b, a; double temp1, temp2, temp3; jahr = 1582; monat= 10; tag = 15; stunde = 0; minute = 0 ; sekunde = 10; h = (stunde/24) + (minute/1440) + (sekunde/86400); a = (int)jahr/100; b = (2-a) + ((int)(a/4)); temp1 = (int)((365.25*(jahr+4716))); temp2 = (int)(30.6001*(monat+1)); temp3 = tag + h + b - 1524.5; jd = temp1 + temp2 + temp3; printf("\n\n %7.5lf\n",temp1); printf("\n\n %7.5lf\n",temp2); printf("\n\n %7.5lf\n",temp3); printf("\n\n %7.5lf\n",jd); getch(); }
sooo laufen tut es jetzt...allerdings will ich/ kann ich kein double benutzen ´:/
kann man sich da irgendwie drumrum mogeln?
andererseits die zahlen sind nunmal xx.xxx.xxx,xxxxx stellig
-
-xc- schrieb:
...nur weiß ich nicth wie ich anders abrunden könnte
http://www.cplusplus.com/reference/clibrary/cmath/floor/
-xc- schrieb:
...allerdings will ich/ kann ich kein double benutzen
Warum nicht?
-
double kann das system nicht
das abrunden problem hat sich schon erledigt
das int casten geht doch
-
-xc- schrieb:
double kann das system nicht
Für temp1, temp2 kannst du direkt nen int nehmen, der klaut dir keine Bits für die Mantisse und du kannst größere Zahlen vor dem Komma darstellen.
Die Nachkommastellen kannst du separat aus dem Term temp3 erhalten. Dann Nachkommastellen abschneiden, und temp3 ohne Nachkommastellen zu temp1, temp2 dazuaddieren.
Mit geeigneten Erweiterungen und ein bisschen Gewurschtel kannst du auch gänzlich auf float/double verzichten und alles mit Ganzzahlen machen.
-
für temp1 ein int? der wert ist recht groß
ich dachte int hat nur 2byte
ich versuche es grade mit long / long long hinzubekommen ^^
aber schön ist das nicht
die idee mit dem abschneiden kam mir auch aber bei überträgen wird das problematisch
naja das könnte man noch mit if lösen...mal schauen
-
-xc- schrieb:
für temp1 ein int? der wert ist recht groß
ich dachte int hat nur 2byte
Ich dachte da eher an unsigned int, hat bei mir 4 Bytes. Ist ein ganz schön dicker Hund von Zahl vor dem Komma.
Kannste ja mit sizeof(unsigned int) checken, wie groß der bei dir ist.-xc- schrieb:
die idee mit dem abschneiden kam mir auch aber bei überträgen wird das problematisch
naja das könnte man noch mit if lösen...Welche Überträge?
temp1, temp2 sind Ganzzahlig, bei den Nachkommastellen von temp3 gibt es daher keine Überträge bei der Addition.
-
temp3 ist negativ
das wirkt sich aufjedenfall auf den vorkommateil aus
edit:
ich werde deinem vorschlag versuchen...
scheint mir das einzig praktikable ich poste obs funktioniert hat/wirdint reicht aber trotzdem leider nicht aus > nur 2byte groß
muss also so oder so auf long 4byte ausweichen
-
-xc- schrieb:
temp3 ist negativ
Oops, dann gibts ja doch nen Übertrag auf die Nachkommastellen!
Ich habe nochmal genauer reingeguckt, man gönnt sich ja sonst nichts Freitag nachts
und habe mal alle float-/double Variable rausgeschmissen, guckst du:typedef unsigned int uint; uint datum_gregorianisch_min = 15821015; // 15.10.1582 uint datum_julianisch_max = 15821004; // 04.10.1582 uint datum_ist = 0; uint D=0, A=0,M=0, Y=0, T=0; uint jahr=0, monat=0, tag=0, stunde=0, minute=0, sekunde=0; int B = 0; // 14. Januar 2006, 16:30 UT (gregorianisch) 2.453.750,1875 jahr = 2006, monat = 1, tag = 14, stunde = 16, minute = 30; datum_ist = jahr * 10000 + monat * 100 + tag; if ( monat > 2 ) Y = jahr, M = monat; else Y = jahr - 1, M = monat + 12; D = tag; // H = stunde/24.0 + minute/1440.0 + sekunde/86400.0; if ( datum_ist >= datum_gregorianisch_min ) { A = (uint)(Y/100.0), B = 2 - A + (uint)(A/4.0); } else { if ( datum_ist <= datum_julianisch_max ) B = 0; else { puts ( "Error, Bruder: Du bist in einem Zeitloch gelandet!" ); exit(666); } } printf("%.4f\n", (uint)(365.25*(Y+4716)) + (uint)(30.6001*(M+1)) + D + stunde/24.0 + minute/1440.0 + sekunde/86400.0 // H + B - 1524.5 ); return 0; // Quelle: http://de.wikipedia.org/wiki/Julianisches_Datum
Nu stellt sich die Frage was du für ne Gurke hast(?), die keinen double hat, double ist laut diverser Quellen ANSI C Standard:
ANSI C considers all floating point constants to be implicitly double precision, and operations involving such constants therefore take place in double precision.
Wenn ich das mit float Variablen rechne, bekomme ich auch Rundungsfehler.
Heißt also, wenn dein Rechner intern nur float kann, dann bringt wohl obiges Ausmisten allein noch nicht den gewünschten Erfolg.Gruß,
B.B.
-
Nu stellt sich die Frage was du für ne Gurke hast(?)
einen µC (atmega8)
mit dem richtigen compiler könnte der das auch aber es wird dann arg langsamatm schwirrt mir als kleines lernprojekt eine uhr die verschiedene zeiten auf einem display anzeigt vor.
sternzeit, julianisches datum, unix-zeit ^^
das ganze gesteuert durch einen dcf77 empfänger (funkuhr)danke für den code...habs aber gestern nacht selbst noch hinbekommen
hier meine jetzt komplett funktionierende version:
main() { int jahr, monat, tag, stunde, minute, sekunde, b, a; long temp1, temp2, h, jd, jd2; char out[16]; jahr = 2009; monat= 11; tag = 21; stunde = 1; minute = 12; sekunde= 30; if(monat<=2) monat+=12; jahr--; h = (stunde*100000)/24 + (minute*100000)/1440 + (sekunde*100000)/86400; a = (int)jahr/100; b = (2-a) + (int)(a/4); if((jahr*365+monat*30+tag)<577704) b=0; //julianischer oder gregorianischer kalender stichtag 04.10.1582 temp1 = (int)(365.25*(jahr+4716)); temp2 = (int)(30.6001*(monat+1))-1525+tag+b; jd2 = h + 50000; while(jd2>=100000) { jd2-=100000; temp2++; } jd = temp1 + temp2; sprintf(out,"%d.%05d\n",jd,jd2); for(int i=0;i<15;i++) { printf("%c",out[i]); if(i==0 || i==3) printf("."); } getch(); }
-
-xc- schrieb:
temp2 = (int)(30.6001*(monat+1))-1525+tag+b;
Muss das nicht 1524.5 sein?
-xc- schrieb:
jd2 = h + 50000;
Wo kommt denn die 50000 her?
-xc- schrieb:
if((jahr*365+monat*30+tag)<577704) b=0;
Meinst du nicht, das es hier nen Fehler bei der Zuweisung geben könnte?
Es kann doch monat_min*30 kleiner werden als tag_max und schon geht
die Stellenwertigkeit flöten.Gruß,
B.B.
-
-xc- schrieb:
temp2 = (int)(30.6001*(monat+1))-1525+tag+b;
Muss das nicht 1524.5 sein?
-xc- schrieb:
jd2 = h + 50000;
Wo kommt denn die 50000 her?
-xc- schrieb:
if((jahr*365+monat*30+tag)<577704) b=0;
Meinst du nicht, das es hier nen Fehler bei der Zuweisung geben könnte?
Es kann doch monat_min*30 kleiner werden als tag_max und schon geht
die Stellenwertigkeit flöten.Gruß,
B.B.