uint64_t : comportement bizarre sur ESP32

Je constate un comportement bizarre lorsque je caste un grand nombre flottant en uint64_t sur ESP32.

Je pars d'un flottant double précision (sur 64 bits), je le caste en uint64_t et j'affiche les deux :

  for (int i = 1; i < 21; i++) {
    double x = (double)(i * 1e9);
    Serial.printf("%f ", x);
    Serial.printf("%u ! = ", (uint64_t)x);
  }

Il se passe quelque chose de bizarre quelque part vers 4e9.
En effet, j'obtiens ceci :

4000000000.000000 4000000000
5000000000.000000 705032704

Quelqu'un peut-il expliquer et me dire comment avoir le bon chiffre entier pour les grands nombres ?
(notez que j'affiche le flottant avec printf car println me donne un overflow...)

Il ne caste pas en uint64_t mais en uint32_t
705032704 = 5000000000 - 4 294 967 296
et le problème doit intervenir à 4 294 967 296

Il doit y avoir une histoire entre C99, C89 et C11.

Je n'ai pas d'ESP32 mais il est possible que ce soit similaire à ce qui se passe avec un Arduino DUE. Imprimer un uint64_t X se fait comme ceci:

printf(" %llu \n", X); // Noter llu pour Long Long unsigned

En revanche printf() avec des floats ou double floats ne fonctionne pas car cette option a été exclue à la compilation pour restreindre la taille du fichier. Donc je dois utiliser Serial.println() pour un loat comme pour un double float. A noter aussi qu'il est tout à fait possible de réintégrer cette option à la compilation moyennant une manip qu'il faudrait rechercher....
à ce moment là, on aurait probablement printf(" %lf \n", MyDoubleFloat);

Je rectifie donc, il doit bien caster en 64 bits, mais l'affichage se ferait sur 32 bits. Merci @ard_newbie

Merci je vais tester

Je ne connaissais pas les long double. Ça monte jusqu'à combien?

18 446 744 073 709 551 615

cf https://fr.wikipedia.org/wiki/Types_de_donn%C3%A9e_du_langage_C

Mes ESP32 aiment dormir longtemps et avec çe petit ULL ils peuvent hiberner !

#define uS_TO_S_FACTOR 1000000ULL  /* Conversion factor for micro seconds to seconds */
#define TIME_TO_SLEEP  XXXXXXX       /* Time ESP32 will go to sleep (in seconds) */

Au temps pour moi, je pensais que c'était un format de flottant qui allait plus haut que les flottants standards...
Merci

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.