Type Float et Serial.print() problème perte de chiffres significatif

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.410-38 à 3.41038

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?

float nombre = 1234.56789123456789;

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

void loop()
{     
}

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.

Comment avoir une précision de plus de è chiffres?

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

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);
}
/***************  OUTPUTS    **************
 bignum0 = 0xffffffffffffff
 bignum0 = 0xFFFFFFFFFFFFFF
 bignum1 = 18446744073709551615
 bignum2 = -4611686018427387904
 bignum3 = -1.123456789876543
 bignum4 = -1.6666666666666667

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

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.

Peut-être jeter un coup d'oeil par là: https://github.com/nickgammon/BigNumberr