Go Down

Topic: Précision d'une variable (Read 645 times) previous topic - next topic

Moi036

Bonsoir,
J'ai une variable ou je dois préciser la précision qui est de 6 chiffres après la virgule, comme ceci :

Code: [Select]
    Serial.print("longitude :");
             Serial.println(sim808.GPSdata.lon,6);


Peut on créer une autre variable longitude ou modifier l'existante pour qu'il ne soit pas nécessaire de mettre le ",6" mais tout en gardant cette précision. ça me faciliterait beaucoup les choses pour la suite du programme.

Merci

lesept

Le 6 que tu utilises ici n'a rien à voir avec la précision de la donnée telle qu'elle est stockée en mémoire, c'est le nombre de décimales que tu vas afficher sur la console.

Si ton nombre est déclaré comme un float, sa précision est de 6 à 7 chiffres, mais ce ne sont pas 6 à 7 chiffres après la virgule. C'est la précision de la représentation de la valeur stockée en mémoire.

Si ta valeur est égale à 1, tu pourras avoir entre 0.999999 et 1.000001
Par contre si tu as le nombre 123456789, tu peux te retrouver avec par exemple 123456888. C'est du moins ce que je comprends de la représentation des float par un arduino.

Si tu veux faire des calculs sur des grands nombres en conservant une précision bien meilleure, il existe une bibliothèque pour ça, elle s'appelle bignumber
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Moi036

Le 6 que tu utilises ici n'a rien à voir avec la précision de la donnée telle qu'elle est stockée en mémoire, c'est le nombre de décimales que tu vas afficher sur la console.

Si ton nombre est déclaré comme un float, sa précision est de 6 à 7 chiffres, mais ce ne sont pas 6 à 7 chiffres après la virgule. C'est la précision de la représentation de la valeur stockée en mémoire.

Si ta valeur est égale à 1, tu pourras avoir entre 0.999999 et 1.000001
Par contre si tu as le nombre 123456789, tu peux te retrouver avec par exemple 123456888. C'est du moins ce que je comprends de la représentation des float par un arduino.

Si tu veux faire des calculs sur des grands nombres en conservant une précision bien meilleure, il existe une bibliothèque pour ça, elle s'appelle bignumber
Oui, c'est bien déclaré en float, si j'enlève le ",6" je n'ai plus que deux chiffres après la virgule.
Si je ne met pas ce",6" la variable a t-elle encore sa précision et c'est juste que ça ne l'affiche pas ?
Je dois travailler avec le 6ème et 7ème caractère, si ils n'existent pas, c'est embêtant.

bidouilleelec

Si je ne met pas ce",6" la variable a t-elle encore sa précision et c'est juste que ça ne l'affiche pas ?

Exactement.

"Je dois travailler avec le 6ème et 7ème caractère"

A l'extérieur de l'Arduino?

Cordialement,
bidouilleelec

Moi036

Exactement.

"Je dois travailler avec le 6ème et 7ème caractère"

A l'extérieur de l'Arduino?

Cordialement,
bidouilleelec
Non, toujours dans le même programme.

Merci, je vais essayé.

bidouilleelec

Non, toujours dans le même programme.

Merci, je vais essayé.
Donc vous devez récupérer les 6 et 7ème décimales dans le programme de l'Arduino?

Moi036

Donc vous devez récupérer les 6 et 7ème décimales dans le programme de l'Arduino?
Faut que j'arrive à mettre le float en string si je veux faire ça, non ?

Code: [Select]
    Serial.print("latitude :");
             Serial.println(sim808.GPSdata.altitude);      //sim808.GPSdata.altitude est en float
             char caractere6 = sim808.GPSdata.altitude.charAt(6);
             Serial.print("caractere6");
             Serial.println(caractere6);

lesept

C'est une altitude ou une latitude ?
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Moi036

C'est une altitude ou une latitude ?
ah oui, j'ai oublié de modifier, je voulais essayé autre chose, voilà ce que je voudrais faire mais, il faut que ma variable "sim808.GPSdata.lat" soit en string ?

Code: [Select]
    Serial.print("latitude :");
             Serial.println(sim808.GPSdata.lat,6);      //sim808.GPSdata.lat est en float
             char caractere6 = sim808.GPSdata.lat.charAt(6);
             Serial.print("caractere6");
             Serial.println(caractere6);



lesept

Non pourquoi utiliser un String ?
Quelle est la précision que tu veux ? Connais tu la précision de la valeur renvoyée par ton GPS ?
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

lesept

Il semble que la bibliothèque que tu utilises n'est pas connue pour être très précise, lis ce message, il pointe vers une autre bibliothèque avec une précision à 10 chiffres.
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Moi036

Non pourquoi utiliser un String ?
Quelle est la précision que tu veux ? Connais tu la précision de la valeur renvoyée par ton GPS ?
Le programme exemple donne une précision de 6 chiffres après la virgule, c'est ce que je voudrais utiliser.
Si j'essai de téléverser le code ci-dessus j'obtiens le message d'erreur suivant :


SIM808_GetGPS:48: error: request for member 'charAt' in 'sim808.DFRobot_SIM808::GPSdata.DFRobot_SIM808::gspdata::lat', which is of non-class type 'float'

    char caractere6 = sim808.GPSdata.lat.charAt(6);

                                         ^

exit status 1
request for member 'charAt' in 'sim808.DFRobot_SIM808::GPSdata.DFRobot_SIM808::gspdata::lat', which is of non-class type 'float'

lesept

Je t'ai dit d'oublier cette bibliothèque et de passer à NeoGPS comme préconisé dans le message que je t'indique plus haut.

Sim808 à une précision limitée, tu n'arriveras pas à faire mieux avec elle même par magie...
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

Go Up