Bonjour
je cherche à effectuer des calculs assez simples mais le résultat obtenu ne me convient pas.
Quand j'écris :
float variable =9*0.1;
j'obtiens 0.899999976 au lieu de 0.9.
Comment régler ça ?
PS : j'obtiens le même résulat si je fais variable = 9/10
float variable = 0.899999976f;
printf("valeur arrondi : %0.1f", variable);
Le 06 juin 2020 à 15:04:39 89ron a écrit :
float variable = 0.899999976f; printf("valeur arrondi : %0.1f", variable);
Le truc c'est que je souhaite réutiliser plus tard cette valeur pour d'autres calculs.
Et j'aimerais éviter de faire ces erreurs sur les autres calculs
utilises un double
Elle représente quoi cette variable ? Si le but c'est la précision utilise des types entiers plutôt (passe en cts si c'est une valeur monétaire, en mm si tu travail avec des distances...).
C'est quoi ton compilateur parceque quand je tape :
float arrondi = 9*0.1;
printf("arrondi: %f", arrondi);
j'ai bien 0.900000 .
Étrange que tu aies ça avec ton calcul, par contre avoir des problèmes d'imprécision avec 3*0.1 aurait été normal car sa représentation exacte en binaire n'est pas possible et est donc forcément une approximation. Il faut donc jouer avec les arrondis selon la précision dont tu as besoin.
Le 06 juin 2020 à 16:43:08 _S0uL a écrit :
Elle représente quoi cette variable ? Si le but c'est la précision utilise des types entiers plutôt (passe en cts si c'est une valeur monétaire, en mm si tu travail avec des distances...).
Ah oui pas con
Merci du conseil
Le 06 juin 2020 à 17:33:37 89ron a écrit :
C'est quoi ton compilateur parceque quand je tape :float arrondi = 9*0.1; printf("arrondi: %f", arrondi);
j'ai bien 0.900000 .
Le truc c'est que je cherche a reutiliser cette valeur.
Je voulais éviter les écarts sur le résultat final.
La question fondamental est combien d'erreur est acceptable pour ton application. float est en gros precis a 7 chiffres et double a 16 chiffres. Si tu as besoin de plus, tu peux utiliser des quads qui sont precis a 32 chiffres. Si tu as besoin de plus de precision, probablement tu ne veux pas d'un systeme a point flottant.
Tu peux utiliser un systeme a precision specifiabl comme bigint avec point fixe. Une autre solution standard est de conserver les valeures sous la forme d'expression arithmetique. Tu stoques literalement le nombre sous la forme 7/15*3, ce qui te permet de factoriser explicitement en 7/5. Ca permet aussi de faire des irrationels, des complexe, ou ce que tu veux vraiment. Naturellement, ca coute relativement cher en stockage et en calcul.
Quel format utiliser depend des besoin de l'application. Dans beaucoup de cas, calcul a point floant et arrondis resoud beaucoup de question.