Algoritmo giorno giuliano
Salve ragazzi
in un post che ho scritto precedentemente chiedevo aiuto per creare un algoritmo che mi permettesse di calcolare i giorni di un'uomo sulla terra fin dalla nascita.
Mi è subito venuto in aiuto un utente di cui adesso non ricordo bene il nickname ma che ringrazio tantissimo.
Per prima cosa mi aveva accennato se quello che avevo in mente era più o meno una cosa di questo tipo
http://www.segnalidivita.com/cronometro/
io gli dissi di si e poi in una seguente risposta gli dissi che mi serviva appunto per un programmino che dovevo creare.
Quindi mi propose di studiare l'algoritmo del giorno giuliano mandandomi direttamente alla pagina di Wikipedia che è questa qui. http://it.wikipedia.org/wiki/Giorno_giuliano
Quindi mi sono messo a fare questi calcoli studiandoci per un paio di giorni.
nella conversione da data normale a data giuliana credo di aver fatto ogni calcolo corretto.
Ho trovato dei problemi invece nella seconda conversione, e cioè quella da data giuliana a data normale.
Ma per un maggiore chiarimento vi rimando passo dopo passo come ho realizzato io il calcolo iniziando dalla data normale alla data giuliana.
Conversione da data normale a data giuliana:
Estraggo da ogni variabile i valori della data.
anno = anno ( dataAttuale ); // 1980
mese = mese ( dataAttuale ); // 02
giorno = giorno ( dataAttuale ); // 12
faccio la stessa cosa con le ore, i minuti e i secondi.
ore = ora ( oraAttuale ); // 15
minuti = minuti ( oraAttuale ); // 32
secondi = secondi ( oraAttuale ); // 12
poi mi viene chiesto se il mese è 1 oppure 2.
Nel mio caso è due quindi procedo col seguente algoritmo.
if mese = 1 or mese = 2 then begin
anno = anno - 1;
mese = mese + 12;
end;
quindi inizio a fare il primo calcolo.
anno è uguale a 1980-1=1979
mese è uguale a 02+12=14
adesso abbiamo 'anno=1979' e 'mese=14'
poi mi viene chiesto se dataAttuale è minore di 15 ottobre 1582.
if dataAttuale < " 15 ottobre 1582 " then begin
a = 0;
b = 0;
end else begin
a = ParteIntera( anno / 100 );
b = 2 - a + ParteIntera( a / 4 );
end;
nel mio caso la data è maggiore quindi passo al ramo end else begin, e faccio quest'altro calcolo.
a=ParteIntera(anno/100);=19
b=2-a+ParteIntera(a/4);=0
adesso la variabile 'a=19' e la variabile 'b=0'.
dopo di che faccio i calcoli delle variabili 'c' e 'd'.
c = ParteIntera( 365.25 * anno );
d = ParteIntera( 30.6001 * ( mese + 1 ) );
quindi c=365.25*anno=722829
d=30.6001*(mese+1))=429
Adesso faccio il calcolo della data giuliana con le variabili fin'ora calcolate.
dataGiuliana = b + c + d + giorno + 1720994.50 - reset; =29244
definisco l'ora senza prendere in considerazione i minuti e i secondi, come mi viene chiesto liberamente.
offsetGiornata = ore / 24;=0,625
Per ultimo, la data giuliana completa.
dataGiuliana = dataGiuliana + offsetGiornata;=29244,625
Adesso passiamo alla conversione da data giuliana a data normale
mi viene chiesto di riaggiustare la mia data con il reset usato nella conversione, quindi:
jd = dataGiuliana + reset;=2444265,125
sommo la variabile 'i' ParteIntera
i = ParteIntera( jd + 0.5 );=2444265
con la variabile 'f' sommo gli stessi valori ma in decimale
f = ParteDecimale( jd + 0.5 );=2444265,625
passo all'istruzione 'if' che mi chiede se 'i' è minore o uguale a 2299160, in questo caso il risultato di 'i' è maggiore quindi passo al ramo end else begin:
if i <= 2299160 then begin
b = i;
end else begin
a = ParteIntera( ( i - 1867216.25 ) / 36524.25 );=15
b = i + 1 + a - ParteIntera( a / 4);=611066
calcolo i valori delle variabili c,d,e,h.
c=b+1524;=612590
d = ParteIntera( ( c - 122.1 ) / 365.25 );=1676
e = ParteIntera( 365.25 * d );=612159
h = ParteIntera( ( c - e ) / 30.6001 );=14
end;
adesso faccio il calcolo del giorno.
giorno = c - e + f - parteIntera( 30.6001 * h );34225324
passo all'istruzione 'if' e mi viene chiesto se h è minore di 14.
if h < 14 then begin
mese = h - 1;
end else begin
mese = h - 13;
end;
nel mio caso 'h' è 14 quindi passo al ramo end else begin e calcolo:
mese=h-13;=1
passo ad una nuova istruzione 'if' dove mi viene chiesto se 'mese' è minore di 3.
if mese < 3 then begin
anno = d - 4715;
end else begin
anno = d - 4716;
end;
in questo caso 'mese' è minore di 3 quindi calcolo:
anno=d-4715;=-3039
quindi estraggo la data normale.
dataAttuale = creaData ( ParteIntera( anno=-3039 ), ParteIntera( mese=1 ), ParteIntera( giorno=34225324 ) );
Arrivato a questo punto seguendo le altre istruzioni non riesco più a capirci nulla, quindi è qui che chiedo il vostro aiuto.
In quanto al lavoro eseguito fin'ora spero di aver fatto ogni calcolo in maniera corretta.
Resto in attesa di un vostro aiuto che senza alcun dubbio siete molto più esperti di me.
Grazie mille in anticipo per chi volesse aiutarmi e mi scuso per aver prolungato troppo il discorso, spero di non avervi annoiato
in un post che ho scritto precedentemente chiedevo aiuto per creare un algoritmo che mi permettesse di calcolare i giorni di un'uomo sulla terra fin dalla nascita.
Mi è subito venuto in aiuto un utente di cui adesso non ricordo bene il nickname ma che ringrazio tantissimo.
Per prima cosa mi aveva accennato se quello che avevo in mente era più o meno una cosa di questo tipo
http://www.segnalidivita.com/cronometro/
io gli dissi di si e poi in una seguente risposta gli dissi che mi serviva appunto per un programmino che dovevo creare.
Quindi mi propose di studiare l'algoritmo del giorno giuliano mandandomi direttamente alla pagina di Wikipedia che è questa qui. http://it.wikipedia.org/wiki/Giorno_giuliano
Quindi mi sono messo a fare questi calcoli studiandoci per un paio di giorni.
nella conversione da data normale a data giuliana credo di aver fatto ogni calcolo corretto.
Ho trovato dei problemi invece nella seconda conversione, e cioè quella da data giuliana a data normale.
Ma per un maggiore chiarimento vi rimando passo dopo passo come ho realizzato io il calcolo iniziando dalla data normale alla data giuliana.
Conversione da data normale a data giuliana:
Estraggo da ogni variabile i valori della data.
anno = anno ( dataAttuale ); // 1980
mese = mese ( dataAttuale ); // 02
giorno = giorno ( dataAttuale ); // 12
faccio la stessa cosa con le ore, i minuti e i secondi.
ore = ora ( oraAttuale ); // 15
minuti = minuti ( oraAttuale ); // 32
secondi = secondi ( oraAttuale ); // 12
poi mi viene chiesto se il mese è 1 oppure 2.
Nel mio caso è due quindi procedo col seguente algoritmo.
if mese = 1 or mese = 2 then begin
anno = anno - 1;
mese = mese + 12;
end;
quindi inizio a fare il primo calcolo.
anno è uguale a 1980-1=1979
mese è uguale a 02+12=14
adesso abbiamo 'anno=1979' e 'mese=14'
poi mi viene chiesto se dataAttuale è minore di 15 ottobre 1582.
if dataAttuale < " 15 ottobre 1582 " then begin
a = 0;
b = 0;
end else begin
a = ParteIntera( anno / 100 );
b = 2 - a + ParteIntera( a / 4 );
end;
nel mio caso la data è maggiore quindi passo al ramo end else begin, e faccio quest'altro calcolo.
a=ParteIntera(anno/100);=19
b=2-a+ParteIntera(a/4);=0
adesso la variabile 'a=19' e la variabile 'b=0'.
dopo di che faccio i calcoli delle variabili 'c' e 'd'.
c = ParteIntera( 365.25 * anno );
d = ParteIntera( 30.6001 * ( mese + 1 ) );
quindi c=365.25*anno=722829
d=30.6001*(mese+1))=429
Adesso faccio il calcolo della data giuliana con le variabili fin'ora calcolate.
dataGiuliana = b + c + d + giorno + 1720994.50 - reset; =29244
definisco l'ora senza prendere in considerazione i minuti e i secondi, come mi viene chiesto liberamente.
offsetGiornata = ore / 24;=0,625
Per ultimo, la data giuliana completa.
dataGiuliana = dataGiuliana + offsetGiornata;=29244,625
Adesso passiamo alla conversione da data giuliana a data normale
mi viene chiesto di riaggiustare la mia data con il reset usato nella conversione, quindi:
jd = dataGiuliana + reset;=2444265,125
sommo la variabile 'i' ParteIntera
i = ParteIntera( jd + 0.5 );=2444265
con la variabile 'f' sommo gli stessi valori ma in decimale
f = ParteDecimale( jd + 0.5 );=2444265,625
passo all'istruzione 'if' che mi chiede se 'i' è minore o uguale a 2299160, in questo caso il risultato di 'i' è maggiore quindi passo al ramo end else begin:
if i <= 2299160 then begin
b = i;
end else begin
a = ParteIntera( ( i - 1867216.25 ) / 36524.25 );=15
b = i + 1 + a - ParteIntera( a / 4);=611066
calcolo i valori delle variabili c,d,e,h.
c=b+1524;=612590
d = ParteIntera( ( c - 122.1 ) / 365.25 );=1676
e = ParteIntera( 365.25 * d );=612159
h = ParteIntera( ( c - e ) / 30.6001 );=14
end;
adesso faccio il calcolo del giorno.
giorno = c - e + f - parteIntera( 30.6001 * h );34225324
passo all'istruzione 'if' e mi viene chiesto se h è minore di 14.
if h < 14 then begin
mese = h - 1;
end else begin
mese = h - 13;
end;
nel mio caso 'h' è 14 quindi passo al ramo end else begin e calcolo:
mese=h-13;=1
passo ad una nuova istruzione 'if' dove mi viene chiesto se 'mese' è minore di 3.
if mese < 3 then begin
anno = d - 4715;
end else begin
anno = d - 4716;
end;
in questo caso 'mese' è minore di 3 quindi calcolo:
anno=d-4715;=-3039
quindi estraggo la data normale.
dataAttuale = creaData ( ParteIntera( anno=-3039 ), ParteIntera( mese=1 ), ParteIntera( giorno=34225324 ) );
Arrivato a questo punto seguendo le altre istruzioni non riesco più a capirci nulla, quindi è qui che chiedo il vostro aiuto.
In quanto al lavoro eseguito fin'ora spero di aver fatto ogni calcolo in maniera corretta.
Resto in attesa di un vostro aiuto che senza alcun dubbio siete molto più esperti di me.
Grazie mille in anticipo per chi volesse aiutarmi e mi scuso per aver prolungato troppo il discorso, spero di non avervi annoiato

Risposte
Titolo: algoritmo giorno giuliano 2
La prossima volta aspetta almeno 24 ore, puoi uppare secondo il regolamento!
"garnak.olegovitc":
http://www.vialattea.net/esperti/php/risposta.php?num=6441
http://www.archaeoastronomy.it/algoritmo_sole.htm
![]()
La prossima volta aspetta almeno 24 ore, puoi uppare secondo il regolamento!








Grazie mille per il link questo algoritmo sembra molto più comprensibile da apprendere.
C'è un'altro problema, scusatemi ancora se vi disturbo ma purtroppo il mio non sapere in certi argomenti mi porta a voler studiare e capire sempre di più.
Purtroppo studiando da autodidatta mi occorre una mano esterna e meglio di voi nessuno è in grado di aiutarmi.
Il problema è questo:
Trovato il risultato della formula del giorno giuliano in cui per libera scelta ho messo la mia data di nascita, il risultato finale è 1597, ecco qui la formula con il risultato:
JD = INT(365,25·(Y + 4716)) + INT(30.6001·(M + 1)) + D + B - 1524.5=1597
adesso come faccio a calcolare dal mio primo giorno di nascita ad oggi e avere il risultato dei miei giorni sulla terra?
GRAZIE ANCORA PER LA PAZIENZA CHE MI PRESTATE
SPERO DI IMPARARE MOLTE COSE INSIEME A VOI
C'è un'altro problema, scusatemi ancora se vi disturbo ma purtroppo il mio non sapere in certi argomenti mi porta a voler studiare e capire sempre di più.
Purtroppo studiando da autodidatta mi occorre una mano esterna e meglio di voi nessuno è in grado di aiutarmi.
Il problema è questo:
Trovato il risultato della formula del giorno giuliano in cui per libera scelta ho messo la mia data di nascita, il risultato finale è 1597, ecco qui la formula con il risultato:
JD = INT(365,25·(Y + 4716)) + INT(30.6001·(M + 1)) + D + B - 1524.5=1597
adesso come faccio a calcolare dal mio primo giorno di nascita ad oggi e avere il risultato dei miei giorni sulla terra?
GRAZIE ANCORA PER LA PAZIENZA CHE MI PRESTATE


SPERO DI IMPARARE MOLTE COSE INSIEME A VOI
"al_turing":
JD = INT(365,25·(Y + 4716)) + INT(30.6001·(M + 1)) + D + B - 1524.5=1597
Mmmm... Secondo me il giorno giuliano dovrebbe essere un numero un po' più grande

ok ok credo di essere andato fuori rotta scusate
mi è venuto adesso un dubbio, ma la cifra 365,25 rientra nel calcolo?
e se è si è una sottrazione? perchè a me non sembra
scusate la domanda banale

mi è venuto adesso un dubbio, ma la cifra 365,25 rientra nel calcolo?
e se è si è una sottrazione? perchè a me non sembra
scusate la domanda banale

ragazzi potrebbe esserci un errore in questa formula?
JD = INT(365,25·(Y + 4716)) + INT(30.6001·(M + 1)) + D + B - 1524.5
perchè proprio non mi esce il risultato corretto o provato e riprovato ma niente...
JD = INT(365,25·(Y + 4716)) + INT(30.6001·(M + 1)) + D + B - 1524.5
perchè proprio non mi esce il risultato corretto o provato e riprovato ma niente...
"al_turing":
ragazzi potrebbe esserci un errore in questa formula?
JD = INT(365,25·(Y + 4716)) + INT(30.6001·(M + 1)) + D + B - 1524.5
perchè proprio non mi esce il risultato corretto o provato e riprovato ma niente...
Ho provato e a me viene lo stesso risultato che viene ai convertitori in rete. Magari scrivi i passaggi che fai così vediamo dove sta l'errore.
ok faccio la formula passo dopo passo utilizzando la mia data di nascita.
y=1988
m=08
d=05
dato che il mese non è 1 e non è 2 lascio invariati l'anno è il mese.
a=int(y/100)=19
b=2-a+int(a/4)=0
infine ti elenco i passaggi della formula di come faccio il calcolo.
JD=INT(365,25-(Y+4716))=3093
+INT(30.6001-(M+1))=3116
+D+B-1524.5=1597
indubbiamente sbaglierò qualche passaggio ma non riesco a capire qual'è.
y=1988
m=08
d=05
dato che il mese non è 1 e non è 2 lascio invariati l'anno è il mese.
a=int(y/100)=19
b=2-a+int(a/4)=0
infine ti elenco i passaggi della formula di come faccio il calcolo.
JD=INT(365,25-(Y+4716))=3093
+INT(30.6001-(M+1))=3116
+D+B-1524.5=1597
indubbiamente sbaglierò qualche passaggio ma non riesco a capire qual'è.
"al_turing":
a=int(y/100)=19
b=2-a+int(a/4)=0
Iniziamo da questo: b = 2-a+int(a/4) = 2-19+int(19/4) = -17+int(4.75) = -17+4 = -13
Ti torna?
Anche gli altri conti mi sembrano tutti sbagliati... Prova a rifarli.