Nous sommes le Sam 26 Juil, 2025 02:31
Supprimer les cookies

[c++] Problemes d'arrondis...

Sur le logiciel libre en général ou un logiciel libre en particulier

Jeu 18 Mai, 2006 16:19

bonjour, ce n'est pas forcement le bon forum pour ce genre de choses, mais comme j'ai mes petites habitudes dans le quartier :-)...

je suis confronté a un probleme auquel je pensais ne jamais me frotter... et auquel je prefererais ne pas me frotter :

formulé simplement, il est evident que vu le caractere limite du stockage des reels en memoire, un truc du genre 1+un petit nombre - 1 donnera 0 et non pas ce petit nombre...

autrement dit, si je pose A=1+e avec e petit, je vais avoir A=1..
ma question est : comment retrouver facilement respectivement le plus petit nombre representable en memoire superieur a A, et le plus grand nombre representable inferieur a A ?? plus clairement, coment retrouver un encadrement de A le plus petit possible ?

merci d'avance : je suis sous linux, gcc 4, et a terme le programme sera compilé sous windows/dev-cpp..
Je sais être bete, à mes heures, sans toutefois m'élever jusqu'à ces glorieux sommets d'où la tuerie vous apparait comme une solution acceptable

Romain GARY
jobherzt

Messages : 581
Géo : Caen

Jeu 18 Mai, 2006 18:05

Tu ne précises pas si tu bosses sur des float ou des double... dommage ;)

Pour un float (32 bits), je crois que tu as un bit pour le signe, 8 pour l'exposant, et 23 pour la mantisse.
=> donc si tu as un 1, le nombre suivant devrait 1 + 2^-22 (sauf erreur de ma part)

Ceci devrait t'amuser un peu : http://babbage.cs.qc.edu/courses/cs341/IEEE-754.html
Penguin

Messages : 751

Jeu 18 Mai, 2006 18:14

en fait, j'ai poursuivi mes recherches, et decouvert que le c++ proposait une fonction "epsilon" ( 2, en fait, une pour float, et une pour double ) qui retourne la valeur que tu donnes.. je pensais bien a un truc comme ca, mais j'avais peur de "mal" le faire a la main..

merci bien !
Je sais être bete, à mes heures, sans toutefois m'élever jusqu'à ces glorieux sommets d'où la tuerie vous apparait comme une solution acceptable

Romain GARY
jobherzt

Messages : 581
Géo : Caen

Jeu 18 Mai, 2006 18:15

et au passage, je ne le precise pas, parce que je passe de l'un a l'autre suivant les besoins... donc j'ai un :
typedef float REEL au debut, et tous mes nombres sont declarés en tant que "REEL"... au cas ou je devrais augementer la precision !
Je sais être bete, à mes heures, sans toutefois m'élever jusqu'à ces glorieux sommets d'où la tuerie vous apparait comme une solution acceptable

Romain GARY
jobherzt

Messages : 581
Géo : Caen

Ven 19 Mai, 2006 08:16

Ce qu'il faut savoir c'est la précision, et elle est relative :

Par exemple, supposons que cette précision soit epsilon :

Code: Tout sélectionner
1+epsilon = 1

Mais :
10*epsilon+epsilon = 11*epsilon !

En principe dans "float.h", il y a des constantes qui te donnent ces valeurs. Chez moi, j'ai :

Code: Tout sélectionner
#define FLT_EPSILON 1.19209290e-07F
#define DBL_EPSILON 2.2204460492503131e-16
 
serged

Avatar de l’utilisateur
Messages : 1300
Géo : Montrouge (92)

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit