Go Down

Topic: Type Float et Serial.print() problème perte de chiffres significatif (Read 597 times) previous topic - next topic

FranckPERRET


Programme tous simple, j'ai un nombre avec beaucoup de chiffres après la virgule, si je l'affiche avec Serial.print, je perd des chiffres ssignificatif.


1234.56789123456789 devient 1234.5678710937

il y a quelque chose que je ne comprend pas, d'après la définition un float peut aller jusqu'à 10-38

float  Flottant (réel) -3.4*10-38 à 3.4*1038


Est-ce juste un problème d'affichage?

Est-ce que le nombre qui est stocké dans la variable reste le bon? ou ai je vraiment perdu de l'information?

J'ai multiplié par 100000 pour voir si je perdais de l'information et je crois que oui.


Quel type de variable dois-je utiliser?



Code: [Select]


float nombre = 1234.56789123456789;

void setup()
{
  while (!Serial);
  Serial.begin(9600);
  Serial.println(nombre,10);
}

void loop()
{     
}

kamill

Bonjour,

Dans l'environnement ardiono (avr), les float sont codés sur 32 bits dont 23 bits de mantisse. Ce qui donne environ 7 chiffres décimaux significatifs.
Il est donc illusoire de vouloir avoir une précision de plus de 7 chiffres.

FranckPERRET


ard_newbie

Avec ce type de code sur un arduino DUE il est possible d'avoir jusqu'à 15 décimales avec précision:

Code: [Select]

uint64_t bignum0 = 0xFFFFFFFFFFFFFFllu;
uint64_t bignum1 = (1llu<<64) - 1; //pow(2, 64) - 1;
int64_t bignum2 = -(1llu<<62); //- pow(2, 62);
double bignum3 = -1.12345678987654321;
double bignum4 = -166666666666666666666e-20;

void setup() {
  Serial.begin(250000);
}

void loop() {
  printf(" bignum0 = 0x%llx\n", bignum0);
  printf(" bignum0 = 0x%llX\n", bignum0);
  printf(" bignum1 = %llu\n", bignum1);
  printf(" bignum2 = %lld\n", bignum2);
  Serial.print(" bignum3 = ");
  Serial.println(bignum3,15);
  Serial.print(" bignum4 = ");
  Serial.println(bignum4,16);
  delay(3000);
}



Code: [Select]

/***************  OUTPUTS    **************
 bignum0 = 0xffffffffffffff
 bignum0 = 0xFFFFFFFFFFFFFF
 bignum1 = 18446744073709551615
 bignum2 = -4611686018427387904
 bignum3 = -1.123456789876543
 bignum4 = -1.6666666666666667

********************************************/

68tjs

C'est le microcontroleur qui limite.
Un avr 8bits (carte UNO, mega,nano,léonardo) sera moins performant qu'un ARM 32 bits.

En ARM 32 bits pour arduino ou trouve les cartes DUE  et Zéro .
En ARM il existe d'autres cartes avec d'autres micros plus performants que ceux des DUE et zero.
Plus performant par exemple sur la capacité mémoire et la fréquence d'horloge.
Mais pour la précision des calculs ils restent de l'ARM 32 bits.

Ils se programment avec  une autre IDE.
Exemple cartes Nucleo de STmicro programmable avec l'IDE Mbed.

_pepe_


fdufnews


_pepe_


Go Up