Problème d'arrondi

Résolu
Lsvd - 12 janv. 2018 à 14:30
Whismeril
Messages postés
17339
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
24 mai 2022
- 24 janv. 2018 à 07:31
Bonjour,

J'ai une fonction en C qui ne manipule que des doubles pour calculer une médiane, sauf qu'en résultat au lieu de me retourner 37.3 elle renvoie 37.299999999997 (par exemple), ce qui fausse tous mes calculs par la suite..

Merci d'avance !

6 réponses

Whismeril
Messages postés
17339
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
24 mai 2022
596
12 janv. 2018 à 16:06
Bonjour
Mais j'ai réellement besoin de la valeur non arrondi

ça n'est pas vraiment un arrondi, par définition un arrondi simplifie le nombre. Mais c'est bien la valeur approchée possible la plus proche.
37.3 n'existe tout simplement pas en double.

Pense à une calculatrice qui affiche 10 caractères et qui sait écrire en notation scientifique.
Si tu tapes "9999999999 + 2" elle va t'afficher "1.000 E+11" (y'a bien 10 caractères). Tu perds en précision car 10000000000 ce n'est pas 10000000001.
C'est ce qu'on appelle un nombre à virgule flottante. Le double ou le float marchent à peu près de la même façon, mais en puissance de 2.
Du coup avec un calcul de ce type et le nombre de "caractères" alloués, 37.3 ne peut pas être décrit.

Voir toute la norme ici
https://fr.wikipedia.org/wiki/Virgule_flottante
0
Whismeril
Messages postés
17339
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
24 mai 2022
596
13 janv. 2018 à 21:00
Quel est le calcul qui te retourne cette valeur?
0
zaibacker
Messages postés
98
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
24 janvier 2018

23 janv. 2018 à 08:58
essaie un truc du genre

float tonFloat = 3.141592654;
float resultFinal;

fprintf ( resultaFinal, "%.2f", tonFloat);

--
0
Whismeril
Messages postés
17339
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
24 mai 2022
596
23 janv. 2018 à 10:10
Non, ceci n’agit que sur la sotie en string, pas sur la valeur numérique
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zaibacker
Messages postés
98
Date d'inscription
vendredi 17 février 2006
Statut
Membre
Dernière intervention
24 janvier 2018

24 janv. 2018 à 02:23
bin tente de le convertir pour voir

float tonFloat = 3.141592654;
string resultString;
fprintf ( resultString, "%.2f", tonFloat);
float resultFinal= ::atof(resultString.c_str());
0
Whismeril
Messages postés
17339
Date d'inscription
mardi 11 mars 2003
Statut
Modérateur
Dernière intervention
24 mai 2022
596
24 janv. 2018 à 07:31
Bon prenons un exemple de la vraie vie.
1 secondes, en minutes:secondes ça s'écrit 00:01, c'est défini de façon exacte en système séxagésimal (base 60).
Si je le mets en minutes décimale, il faut diviser 1 par 60 = 0,016666666666666667 à la fin on prend la valeur approchée supérieure car on ne peut pas le définir de façon exacte.

Et bien 37.3 existe en décimale et pas en double C++ de l'os de lsvd, je précise pour l'os car la définition du format double peut varier d'un os à l'autre.
0