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

a marqué ce sujet comme résolu.

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

+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.

+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  

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 ?

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.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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