Algoritmo giorno giuliano

al_turing
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 :D

Risposte
garnak.olegovitc1
Titolo: algoritmo giorno giuliano 2

"garnak.olegovitc":

http://www.vialattea.net/esperti/php/risposta.php?num=6441

http://www.archaeoastronomy.it/algoritmo_sole.htm

:smt023 :wink:


La prossima volta aspetta almeno 24 ore, puoi uppare secondo il regolamento! :wink: :wink: :wink: :wink: :wink: :wink: :wink: :smt023

al_turing
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

retrocomputer
"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 :wink:

al_turing
ok ok credo di essere andato fuori rotta scusate :-D
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 :-D

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

retrocomputer
"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.

al_turing
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'è.

retrocomputer
"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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.