Erreurd'arrondi avec Serial.print(float,int)

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Avec une Arduino Mega, je ne comprends pas pourquoi la commande suivante : Serial.println(3.1415926535, 8); donne le résultat suivant :3.14159274 au lieu de : 3.14159265

Merci par avance de votre aide.

+0 -0

Salut, sur la référence arduino y'a marqué:

Serial.println(val, format) format: specifies the number base (for integral data types) or number of decimal places (for floating point types)

Donc apparemment tu dois être en train d'écrire ton chiffre en base octale, c'est peut-être lié.

Essaye Serial.println(3.1415926535, DEC);

Pour info, pour format tu peut mettre HEX, DEC, OCT ou BIN, qui valent respectivement 16,10,8 ou 2.

EDIT:

J'ai fait le test avec un arduino UNO, pour HEX, DEC, OCT et BIN j'obtiens :

3.1415927410125732
3.1415927410
3.14159274
3.14

Édité par Fab

+0 -0

sur la référence arduino y'a marqué:

Serial.println(val, format) format: specifies the number base (for integral data types) or number of decimal places (for floating point types)

Donc apparemment tu dois être en train d'écrire ton chiffre en base octale, c'est peut-être lié.

Fab

Ta citation te contredit…

AMHA, la bonne réponse se trouve ici :

Floats have only 6-7 decimal digits of precision. That means the total number of digits, not the number to the right of the decimal point.

Édité par yoch

+0 -0

Ah oui effectivement, j'avais pas bien lu.

Apparemment les doubles font la même taille que les floats, donc ça fait pareil.

Si t'as besoin de faire des calculs avec pi, tu peux utiliser ceux déjà défini dans la librairie arduino : PI, HALF_PI, TWO_PI, DEG_TO_RAD, RAD_TO_DEG.
Ils sont défini dans le fichier Arduino.h :

1
2
3
4
5
#define PI 3.1415926535897932384626433832795  
#define HALF_PI 1.5707963267948966192313216916398  
#define TWO_PI 6.283185307179586476925286766559  
#define DEG_TO_RAD 0.017453292519943295769236907684886  
#define RAD_TO_DEG 57.295779513082320876798154814105  
+0 -0
Auteur du sujet

Merci pour toutes ces réponses car effectivement un nombre de type float se limite en précision à 7 digit, virgule ou pas. Question pour Fab : quelle utilité de tes valeurs données sur PI avec autant de chiffres après la virgule sachant que seuls les 6 premiers sont valides ?

+0 -0

Parce que ça ne mange pas de pain, et qu'il y a des cartes qui supportent un précision plus grande pour double ?

yoch

Et surtout, on evite des erreurs d'arrondis en compile time. C'est utilise aussi sur des architectures classiques ou les constantes sont donnees avec une precision bien au dela de la double voire quadruple precision. En fait gcc utilise mpfr pour la manipulation d'expressions constantes a la compilation. Utiliser une macro avec une grande precision est une alternative.

C'etait mes deux sous.

Édité par KFC

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte