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önnte 😕

    main()
    {
          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/wird

    int 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.

    http://techpubs.sgi.com/library/tpl/cgi-bin/getdoc.cgi?coll=0650&db=bks&fname=/SGI_Developer/CLanguageRef/ch05.html

    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 langsam

    atm 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.


Anmelden zum Antworten