Arduino Forum

International => Français => Topic started by: Moi036 on Apr 19, 2019, 08:55 pm

Title: Précision d'une variable
Post by: Moi036 on Apr 19, 2019, 08:55 pm
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
Title: Re: Précision d'une variable
Post by: lesept on Apr 19, 2019, 11:59 pm
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 (https://github.com/nickgammon/BigNumber)
Title: Re: Précision d'une variable
Post by: Moi036 on Apr 20, 2019, 11:58 am
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 (https://github.com/nickgammon/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.
Title: Re: Précision d'une variable
Post by: bidouilleelec on Apr 20, 2019, 12:13 pm
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
Title: Re: Précision d'une variable
Post by: Moi036 on Apr 20, 2019, 12:17 pm
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é.
Title: Re: Précision d'une variable
Post by: bidouilleelec on Apr 20, 2019, 12:33 pm
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?
Title: Re: Précision d'une variable
Post by: Moi036 on Apr 20, 2019, 12:49 pm
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);
Title: Re: Précision d'une variable
Post by: lesept on Apr 20, 2019, 12:53 pm
C'est une altitude ou une latitude ?
Title: Re: Précision d'une variable
Post by: Moi036 on Apr 20, 2019, 02:20 pm
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);


Title: Re: Précision d'une variable
Post by: lesept on Apr 20, 2019, 02:32 pm
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 ?
Title: Re: Précision d'une variable
Post by: lesept on Apr 20, 2019, 02:36 pm
Il semble que la bibliothèque que tu utilises n'est pas connue pour être très précise, lis ce message (http://forum.arduino.cc/index.php?topic=473672.0), il pointe vers une autre bibliothèque avec une précision à 10 chiffres.
Title: Re: Précision d'une variable
Post by: Moi036 on Apr 20, 2019, 02:39 pm
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'
Title: Re: Précision d'une variable
Post by: lesept on Apr 20, 2019, 05:20 pm
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...