# C et C++ > C > Contribuez >  Faites attention aux floats ! [Trucs & Astuces]

## huit_six

```

```

sortie console :


```
23413472.000000
```

C'est certainement machine dpendant, mme certainement dpendant du compilo, mais franchement a fout les boules quand a arrive  ::D: .
(gcc 4.4.1 ubuntu 9.10 32bits)

----------


## diogene

C'est normal ! Ca dpend de la reprsentation 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 entires deviennent approches puisque devant tre codes 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.

----------


## huit_six

Je suis d'accord, mais je postais ce message pour bien mettre l'accent sur les dangers de la reprsentation des rels en C. Ce genre de bug (que je viens d'avoir cette aprs midi) est difficile  dboguer : je croyais que c'tait un pointeur foireux, dpassant d'un tableau qui me modifiait de manire 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...

----------


## diogene

L'erreur est d'utiliser des floats pour reprsenter des entiers si la nature de la valeur est d'tre entire.

----------


## fearyourself

> L'erreur est d'utiliser des floats pour reprsenter des entiers si la nature de la valeur est d'tre entire.


En effet. L'utilisation de double aura bien sr le mme souci mais pas pour les mmes valeurs, pour le voir, faudra avoir des valeurs beaucoup plus grandes.




> 23413471.000000


Jc

----------


## huit_six

En fait plus concrtement, le programme dans lequel j'utilisais des rels calculait le nombre (dcimal) puis plaais la virgule en divisant par une puissance de dix...



> L'erreur est d'utiliser des floats pour reprsenter des entiers si la nature de la valeur est d'tre entire.


Je suis parfaitement d'accord, mais j'irai plus loin en disant qu'il vaut mieux, si possible, utiliser des entiers quand on a affaire  des dcimaux, car il n'y a pas de surprise, on peut savoir exactement quand arrivent les dpassements de capacit.

----------


## PRomu@ld

Plusieurs solutions sont envisageables :

-> Utiliser une bibliothque de prcision arbitraire (mais le calcul n'est pas exact)
-> Utiliser des rationnels (mme si tout n'est pas reprsentable), a permet de faire des calculs exacts, reste les problmes mmoire. Mais suivant l'application a peut passer.

----------


## souviron34

ceci devrait te donner une rponse (pratiquement) correcte :



```
	float f = 23413470.0f + 1.0f;
```

----------


## Pouet_forever

Chez moi a donne toujours 23413472.000000 :'(

----------


## Lavock

Les float ont un prcision 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'opration (premire) 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 problme est que le C travail toujours avec IEEE754 1985, rviser en 1987. En mme temps, la dernire norme est sortie l'an dernier, et accueil, chaleureusement, les dcimales (32/64/128). Est-ce que le C les verras se rajouter  une norme C1x ? J'espre quand mme >< !

----------

