probleme de coherence de formule de calcul

bonjour, j ai une formule:

int duration
long valreference
float poidstarget
float poidslu

duration= ((((float)poidstarget-(float)poidslu)/1000)*valreference); // duration en milliseconde

si je print sur l ecran separement (((float)poidstarget-(float)poidslu)/1000) et valreference

j obtient bien les bonnes valeurs après avoir fait mes pesées sur ma balance et le reste du programme

si mon poids target est de 100gr, et que mon poidslu est de 10gr, et mon valreference de 60 000ms,
mon calcul duration est coherent et donne 5400ms soit 5.4seconde

par contre si je met 1000gr et toujours 10gr en pesée, et le meme valreference, le calcul de duratione st completement incoherent, il donne genre 7500ms par là hors il devrait en donner 54 000

donc comme je maitrise pas trop les long; float et int, peut etre que le soucis vient de la?

Bonjour,

duration doit être un long ou un unsigned long

Bonsoir,

Les conversions de type (float) ne servent à rien puisque poidstarget et poidslu sont déjà des float.

En plus de déclarer :

long duration;

Il faut convertir le résultat de (poidstarget - poidslu) en long pour que la formule soit cohérente.
Le problème quand vous allez diviser par ex. 90 par 1000 est que cela va donner 0 en entiers.

Une solution est de diviser par 1000 à la fin, en forçant le compilateur avec des ().

duration= ((long)(poidstarget-poidslu)*valreference)/1000; // duration en milliseconde

On peut aussi écrire 2 lignes, où l'on est sûr de ce que l'on fait :

duration= (long)(poidstarget-poidslu)*valreference;
duration /= 1000; // duration en milliseconde

Bonne bidouille

MicroQuettas

Comme poidstarget et poidslu sont des flottants tout le calcul est fait en flottant
Il suffit donc d'écrire

long duration= (poidstarget-poidslu)/1000*valreference;

alors j ai trouver ou est le probleme, c est la taille de duration

au dela de 32 000, le calcul deconne, en dessous c est coherent

on a essayer ça mais cela ne change rien

duration et timerduration sont en unsigned long

Bonjour,

vtec35:
on a essayer ça mais cela ne change rien

duration et timerduration sont en unsigned long

Poste ton code modifié.

le code est trop long pour allez ici entier

vtec35:
alors j ai trouver ou est le probleme, c est la taille de duration

vtec35:
on a essayer ça mais cela ne change rien

duration et timerduration sont en unsigned long

??????

Heu! faudrait savoir. Ca fonctionne ou ça fonctionne pas ?

trouver le probleme ne veut pas dire l avoir resolu

vtec35:
le code est trop long pour allez ici entier

Dropbox - Error

Je sais, c'est long et ch... mais la seule méthode pour résoudre un problème efficacement est de l'isoler. Au lieu de ça, tu es toujours à travailler avec ton code complet et ton problème n'est toujours pas résolu.
Donc, écris les 5 lignes strictes nécessaires pour mettre en évidence le problème et ce sera beaucoup plus facile de voir ce qui ne va pas.

A part ça, comme ça doit être mon jour de bonté, j'ai parcouru ton code en diagonale.
Ce truc là:

printf("%lu", duration);

c'est censé t'afficher duration quelque part ? Où ?

ça print sur l ecran

donc c est bon le code est mis a jour et fonctionnelle

printf("%lu", duration);

a ete remplacé par

sprintf(buffer, “d=%lums”, duration);