Calculs de grands nombres

Bonjour,

J'essaye actuellement de faire un tracker solaire en calculant les coordonnées du soleil mais je suis assez embêté avec les calculs.

Dès que j'utilise de grand nombre, les calculs deviennent faux,, par exemple pour cette fonction :

float jour_julien(int annee, int mois, float jour)
{
    if(mois==1 || mois==2)
    {
        annee=annee-1;
        mois=mois+12;
    }
    float JJ;
    int A=annee/100;
    int B=2-A+(int)(A/4);
    long int C = 365.25*(annee+4716)-1524;
    long int D = 30.6001*(mois+1)+B;
    JJ=(float)(C)+(float)(D)+jour-0.5;
    return JJ;
}

En entrant jour_julien(1957,10,4.81) je reçois 2436113.25 alors que le bon calcul donne 2436116.31.
J'ai essayé de mettre des long int mais dès que je repasse par un float les erreurs apparaissent.

Je m'en sors vraiment plus, j'ai essayé par je ne sais combien de façon de faire un tel programme pour mon panneau solaire mais aucun ne me donne de bon résultats..

Comment puis-je régler ce problème ?
Ou même, quelqu'un aurait-il un programme de calcul des coordonnées du soleil ?

Merci d'avance.

Bonjour

Remplace les float par des double

J'obtiens le même résultat avec des double..

Il me semble que les double et les float était pareil sur une carte Arduino, cf http://www.arduino.cc/en/Reference/Float

bonjour,
ton calcul doit être faux à la base puisqu'il ne prend pas en compte les minutes et secondes.
tu dois avoir fait une erreur de frappe sinon avec le 4.81

En entrant jour_julien(1957,10,4.81) je reçois 2436113.25 alors que le bon calcul donne 2436116.31

Le résultat est juste (tiré d'un livre), 4.81 correspond au 4ème jour d'Octobre à 19h26min24s (4.81 = 19/24 + 26/1440 + 24/86400)

je viens de m'amuser a retranscrire en calcul ta fonction et je ne trouve pas le même résultat
le truc est que tu passe d'un int à un float ce qui fait que si tu as 1 au départ en float ca donne 1.00

4/10/1970--4.81

int A=1970/100; =========================>19
int B=2-A+(int)(A/4); =================>2-19+19/4====>-17+4===> -13
long int C = 365.25*(annee+4716)-1524;=> 365.25*(1970+4716) - 1524 ===>365.256686 -1524==>2440537
long int D = 30.6001
(mois+1)+B;=======>30.6001*(10+1)+ -13====> 323
JJ=(float)(C)+(float)(D)+jour-0.5;=====> 2440537 + 323 + (4.81-0.5) ====> 2440537 + 323 + 4.31 ===> 2440864.31

@ Kamloops
tu annonces 2436113.25, c'est surement une erreur de frappe
tu dis que le bon resultat est 2436116.31

chez moi j'ai 24361116.25 ( ce que je pense tu as voulu mettre)

tu es sur que le resultat est 2436116.31 ?

voici une copie écran du déroulement du prog
A 19
B -13
C 2435789
D 323
j = 4.81 - 0.5 = 4.31 ............... ici j est un float
jj 2436112.00............................ici JJ est un float
jj + j= 2436116.25____________et l'addition des deux est fausse

le bon résultat devrait être 16.31

voici le code pour ceux qui voudraient chercher comment une addition de 2 float peut être fausse

void setup() {
Serial.begin(57600);
// put your setup code here, to run once:
float nombre=jour_julien(1957,10,4.81);
Serial.print("jj retourne = ");Serial.print(nombre,DEC);
}

void loop() {

}
float jour_julien(int annee, int mois, float jour)
{
if(mois==1 || mois==2)
{
annee=annee-1;
mois=mois+12;
}
float JJ;
//int A=annee/100;
//int B=2-A+(int)(A/4);
// long int C = 365.25*(annee+4716)-1524;
//long int D = 30.6001*(mois+1)+B;
int A=annee/100;
Serial.print("A ");Serial.println(A);
int B=2-A+((int)(A/4));
Serial.print("B ");Serial.println(B);
long C = (365.25*(annee+4716))-1524;
Serial.print("C ");Serial.println(C);
long D = (30.6001*(mois+1))+B;
Serial.print("D ");Serial.println(D);

float j=jour-0.5;

Serial.print("j = ");Serial.print(jour);
Serial.print(" - 0.5 = ");Serial.println(j);

JJ=((float)C+D);//+(j);
Serial.print("jj ");Serial.println(JJ);
JJ=C+D+j;
//Serial.print("jj + j= ");Serial.println(JJ);
//Serial.print(JJ);Serial.print(" + ");Serial.println(j);
//JJ=(float)(C)+(float)(D)+jour-0.5;
return JJ;
}

bizard, on trouve pas la même chose pour C ?