|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre confirmé
![]() Inscription : avril 2009 Messages : 180 ![]() |
Code :
C'est certainement machine dépendant, même certainement dépendant du compilo, mais franchement ça fout les boules quand ça arrive (gcc 4.4.1 ubuntu 9.10 32bits) |
||
|
|
00
|
|
|
#2 |
![]() ![]() Patrick GonordEnseignant Chercheur Inscription : juin 2005 Messages : 5 431 ![]() |
C'est normal ! Ca dépend de la représentation des floats.
Classiquement, tu as certainement une mantisse sur 23 bits pour ton float (de 4 octets). Au delà de 2^^24 (16.777.216) (24 parce que 1 bit est implicite) certaines valeurs entières deviennent approchées puisque devant être codées sur plus de 23 bits et tu n'auras plus au fur et à mesure que tu augmentes le nombre que des valeurs multiples de 2 puis de 4 etc.
__________________
Publication : Concepts en C Mon avatar : Glenn Gould -------------------------------------------------------------------------- Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
|
|
|
00
|
|
|
#3 |
|
Membre confirmé
![]() Inscription : avril 2009 Messages : 180 ![]() |
Je suis d'accord, mais je postais ce message pour bien mettre l'accent sur les dangers de la représentation des réels en C. Ce genre de bug (que je viens d'avoir cette après midi) est difficile à déboguer : je croyais que c'était un pointeur foireux, dépassant d'un tableau qui me modifiait de manière bizarre mes variables !
Donc ce message c'était juste pour dire de faire attention sachant que souvent il est possible d'utiliser des ints en remplacement... |
|
|
00
|
|
|
#4 |
![]() ![]() Patrick GonordEnseignant Chercheur Inscription : juin 2005 Messages : 5 431 ![]() |
L'erreur est d'utiliser des floats pour représenter des entiers si la nature de la valeur est d'être entière.
__________________
Publication : Concepts en C Mon avatar : Glenn Gould -------------------------------------------------------------------------- Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
|
|
|
10
|
|
|
#5 | ||
![]() ![]() Ingénieur Informaticien Senior Inscription : décembre 2005 Messages : 5 001 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#6 | |
|
Membre confirmé
![]() Inscription : avril 2009 Messages : 180 ![]() |
En fait plus concrètement, le programme dans lequel j'utilisais des réels calculait le nombre (décimal) puis plaçais la virgule en divisant par une puissance de dix...
Citation:
|
|
|
|
00
|
|
|
#7 |
![]() ![]() Romuald PerrotAttaché Temporaire d'Enseignement et de Recherche (ATER) Inscription : avril 2005 Messages : 4 146 ![]() |
Plusieurs solutions sont envisageables :
-> Utiliser une bibliothèque de précision arbitraire (mais le calcul n'est pas exact) -> Utiliser des rationnels (même si tout n'est pas représentable), ça permet de faire des calculs exacts, reste les problèmes mémoire. Mais suivant l'application ça peut passer.
__________________
http://rperrot.developpez.com http://phos-graphein.fr Vous désirez contribuer à la rubrique algorithmique, n'hésitez pas à me contacter. |
|
|
00
|
|
|
#8 |
|
Expert Confirmé Sénior
![]() Inscription : janvier 2007 Messages : 9 569 ![]() |
ceci devrait te donner une réponse (pratiquement) correcte :
__________________
"Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle". Consultant indépendant. Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie. C, Fortran, XWindow/Motif, Java Je ne réponds pas aux MP techniques |
|
|
00
|
|
|
#9 |
|
Membre chevronné
![]() Inscription : octobre 2009 Messages : 671 ![]() |
Chez moi ça donne toujours 23413472.000000 :'(
__________________
Plus tu pédales moins fort, moins t'avances plus vite. |
|
|
00
|
|
|
#10 |
|
Membre expérimenté
![]() Inscription : octobre 2009 Messages : 560 ![]() |
Les float ont un précision de 6 digit. D'ou l'erreur. Il n'est simplement pas possible d'écrire se nombre à l'aide de ceux-ci.
D'ailleurs, l'opération (première) additionne d'abord deux long, ce qui te donne un long (valeur exacte donc). Ensuite, celui-ci est transformer du mieux qu'il peux en float. Le problème est que le C travail toujours avec IEEE754 1985, réviser en 1987. En même temps, la dernière norme est sortie l'an dernier, et accueil, chaleureusement, les décimales (32/64/128). Est-ce que le C les verras se rajouter à une norme C1x ? J'espère quand même >< ! |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com