Se connecter

Informatique

Programmation

Sujet : [C] éviter les erreurs de précision des calculs
1
GennGrisetete
Niveau 32
06 juin 2020 à 14:52:02

Bonjour :hello:
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

89ron
Niveau 10
06 juin 2020 à 15:04:39
 
float variable = 0.899999976f;
printf("valeur arrondi : %0.1f", variable);
GennGrisetete
Niveau 32
06 juin 2020 à 15:06:52

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

dechet_s0cial
Niveau 10
06 juin 2020 à 15:09:13

utilises un double

_S0uL
Niveau 9
06 juin 2020 à 16:43:08

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...).

89ron
Niveau 10
06 juin 2020 à 17:33:37

C'est quoi ton compilateur parceque quand je tape :


    float arrondi = 9*0.1;
    printf("arrondi: %f", arrondi);

j'ai bien 0.900000 .

cybevil
Niveau 17
06 juin 2020 à 19:18:51

É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.

GennGrisetete
Niveau 32
06 juin 2020 à 21:16:36

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 :hap:

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.

godrik
Niveau 22
07 juin 2020 à 03:23:37

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.

1
Sujet : [C] éviter les erreurs de précision des calculs
   Retour haut de page
Consulter la version web de cette page