Calcule sur un tableau de float en c++

Toinoobz
lun, 09/07/2020 - 11:40
J'utilise un module GPS6MV2 pour un projet.
j'aimerais faire une moyenne et exclure les valeures aberrantes de mon calcule. Voici le code sur lequel je n'arrive pas à inséré les float dans mon tableau de float.
float latExploitable;
float lonExploitable;
float latitude[5];
float longitude[5];void setup() {
// put your setup code here, to run once:
Serial.begin(230400);latExploitable = 43.530479; //valeur extraite du trame NMEA
lonExploitable = -1.01839;
}void loop() {
// put your main code here, to run repeatedly:
float oldLat, oldLon;
Serial.print("Vos coordonées GPS entrées :");
Serial.print(latExploitable, 6);
Serial.print(", ");
Serial.println(lonExploitable, 6);
if ((lonExploitable = ! 0) && (latExploitable = ! 0))
{
oldLat = latExploitable;
oldLon = lonExploitable;
for (int i = 0; i < 4; i++) //on decalle les valeures vers la droite
{
latitude[4 - i] = latitude[3 - i];
longitude[4 - i] = longitude[3 - i];
Serial.print("Vos coordonées GPS en ");
Serial.print(4 - i);
Serial.print(" :");
Serial.print(latitude[4 - i], 6);
Serial.print(", ");
Serial.println(longitude[4 - i], 6);
}
latitude[0] = latExploitable;
longitude[0] = lonExploitable;
Serial.print("Vos coordonées GPS en 0:");
Serial.print(latitude[0], 6);
Serial.print(", ");
Serial.println(longitude[0], 6);
Serial.print("Vos coordonées GPS sauvegardé :");
Serial.print(oldLat, 6);
Serial.print(", ");
Serial.println(oldLon, 6);//on determine la valeure moyenne
float latMoy = 0;
float lonMoy = 0;
for (int i = 0; i < 5; i++)
{
latMoy += latitude[i];
lonMoy += longitude[i];
}
latMoy /= 5;
lonMoy /= 5;
Serial.print("latMoy :");
Serial.println(latMoy);
//on determine la valeure max et min
float latMax, latMin, lonMax, lonMin;
float latMedian, lonMedian;
latMax = latMoy;
latMin = latMoy;
lonMax = lonMoy;
lonMin = lonMoy;
for (int i = 0; i < 4; i++)
{
if (latitude[i] >= latitude[i + 1]) {
latMax = latitude[i];
} else latMax = latitude[i + 1];
if (latitude[i] <= latitude[i + 1]) {
latMin = latitude[i];
} else latMin = latitude[i + 1];
if (longitude[i] >= longitude[i + 1]) {
lonMax = longitude[i];
} else lonMax = longitude[i + 1];
if (longitude[i] >= longitude[i + 1]) {
lonMin = longitude[i];
} else lonMin = longitude[i + 1];
}
Serial.print("latMax :");
Serial.println(latMax);//on calcule l'ecart entre la plus grande valeure et la plus petite
latMedian = latMax - latMin;
lonMedian = lonMax - lonMin;
Serial.print("latMedian :");
Serial.println(latMedian);if (latMedian >= 0.005)
{
latExploitable = oldLat;
} else latExploitable = latMoy;
if (lonMedian >= 0.005)
{
lonExploitable = oldLon;
} else lonExploitable = lonMoy;
}
Serial.print("coordonnées de sortie: ");
Serial.print(latExploitable, 6);
Serial.print(",");
Serial.println(lonExploitable, 6);
delay(1000);}
J'ai lu dans des cours:
"a=b; si b est un float, il est converti en double" j'en déduit que a est de type double.
Walter
lun, 09/07/2020 - 16:22
Salut,
en regardant vite fait, je ne vois pas ce qui pourrait provoquer une erreur à l'affectation.
Peut tu donner l'erreur?
Toinoobz
lun, 09/07/2020 - 18:29
Salut Walter, je travaille deçu depuis 48 heure (j'ai dormis quand même) et j'ai trouvé!!!
L'erreur est qu'un float ne dois pas être égal à un entier, sans quoi le compilateur ne le prend pas en compte.
j'ai tout simplement initialisé la moyenne a 0.0 au lieu de 0 et divisé par 5.0 au lieu de 5...
et modifier la methode d'enregistrement du latMax par:
Sans quoi j'ecrasait latMax par les autres valeurs.
Merci à bientot!
Walter
lun, 09/07/2020 - 19:32
Je suis assez dubitatif sur ton explication, mais si ça marche c'est le principale.
Tu avais une erreur ou le comportement ne correspondait pas à tes attentes?
Pourquoi ne calcule tu pas ta min, max, moyenne en même temps ?
Toinoobz
lun, 09/07/2020 - 20:19
J'ai moi même du mal à comprendre mais cette page m'a aidé:
il explique les opérateurs arithmétique en particulier pour les float.
je vais optimiser mon programme pour calculer en même temps, la décomposition m'a aider, je crois, à trouver le problème. Merci
Walter
lun, 09/07/2020 - 21:06
Ha ok, j'ai loupé ta division / 5
Normalement et c'est ce que dit ta page, comme latMoy est un float la division devrait être un float.
par contre si LatMoy était un entier divisé par un autre entier, tu aurais en entier comme résultat de la division.