Vous avez dit float (ou double) .....

Bonjour,

Nouveau venu sur ce forum, j'espère - en tant que débutant - être aidé le plus possible pour parvenir à mon tour à guider certains ...

Mon programme (et mon problème) est simple :

  • Je déclare un float (ou un double)
  • Je lui affecte une valeure : val = 123456789.1234
  • Je fait un Serial.println(val,4);

et là ..... horreur !!!!! il m'affiche un arrondi grossier de ma variable ...

Une personne peut-elle m''expliquer ce qui ce passe ... le but de la vrai vie étant de passer en udp les 4 octects représentant le float que je veux transmettre (union ....)

Merci d'avance !

Merci pour ton retour !

J'ai en effet utilisé l''union pour transmettre mon float (trouvé sur internet)

Mais je crois que je me suis perdu en chemin : c'est le coup de la base 10 qui passe pas :

Comment afficher alors la bonne valeur ?

@+

@pepe : est-ce-qu'il y a un moyen de forcer un double à être sur 64 bits (ou plus) sur Arduino/Atmega328P ?

pepe:
Non, mais on peut utiliser sa propre bibliothèque de calcul. Les opérations de base peuvent alors être invoquées au travers de fonctions en C, ou en utilisant des objets en C++.

Dommage, avec les entiers on peut, mais utiliser sa propre librairie suppose aussi de se recoder toutes les fonctions mathématiques nécessaires (cos, sin, tan, sqrt, …) même si c’est tout à fait faisable ca commence à faire du boulot… :frowning:
Merci pour ta réponse rapide ! :slight_smile:

Merci encore pepe ! Tes compétences forcent mon admiration !

J'ai un défaut (qualité ?) : Je n'aime pas ne pas tout comprendre ... Alors au risque de devenir pénible, je persiste :

Dans ton premier post tu dis que les 7 premiers chiffres ont été conservés

=>Dois- je comprendre qu'après 7 chiffres significatifs (où que se trouve la virgule), le système peut se permettre d'approcher au mieux la valeur cible ? ...

==> Et que donc tout résultat (et non plus affichage) n'est peut être pas aussi précis que l'on souhaiterai ?

Mes questions (aussi bêtes soient-elles) sont motivées par un simple test qui me perturbe :

float retour = 1234.567; float decimal; long entier;

entier = floor(retour); decimal = retour-entier;

Serial.print("dec : "); Serial.println(decimal,6); // 0.567017 sniff (mais je n'ai que 7 chiffres !!!)

while (decimal != floor(decimal)) // On ne fait que du calcul donc on devrait être bon ... decimal *=10.0; // Je transforme ma partie décimale en un entier

Serial.print("dec : "); Serial.println(decimal,0); // 5670166 ... re-sniff ... je m'attendais à 567 // pourtant toute partie décimale n'a été que calcul !

Merci mille fois pour ton retour !

c'est plus clair maintenant.

Ce que je retiens ce cette expérience c'est :

  • L'arduino N'EST PAS une unité de calcul, il est surtout utilisé pour des maquettes électroniques travaillant sur du binaire ou des arrondis de valeurs analogiques (via la mesure du voltage)

  • Il est préférable de travailler sur des entiers (ratio de mesure entre 0 et 5V) et de transmettre ces information à une unité de calcul plus performante (PC, Raspberry, ...)

-Il vaut mieux utiliser (pour un facteur de forme assez light) un raspberry pour gérer une UI (interface utilisateur)

J'ai tout compris ? (enfin ... sur ce sujet ;-) )