Quelle est la différence entre le type de données float et integer lorsque la taille est la même?
float
stocke des valeurs à virgule flottante, c'est-à-dire des valeurs qui ont des décimales potentiellesint
stocke uniquement les valeurs intégrales, c'est-à-dire les nombres entiersAinsi, alors que les deux ont une largeur de 32 bits, leur utilisation (et leur représentation) est assez différente. Vous ne pouvez pas stocker 3.141 dans un entier, mais vous pouvez dans un float
.
Les disséquant un peu plus loin:
Dans un entier, tous bits sont utilisés pour stocker la valeur numérique. C'est (en Java et de nombreux ordinateurs aussi) fait dans le soi-disant complément à deux. Cela signifie essentiellement que vous pouvez représenter les valeurs de -231 à 231- 1.
Dans un flottant, ces 32 bits sont divisés en trois parties distinctes: le bit de signe, l'exposant et la mantisse. Ils se présentent comme suit:
S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM
Il existe un seul bit qui détermine si le nombre est négatif ou non négatif (zéro n'est ni positif ni négatif, mais le bit de signe est mis à zéro). Ensuite, il y a huit bits d'exposant et 23 bits de mantisse. Pour obtenir un nombre utile à partir de cela, (grosso modo) le calcul suivant est effectué:
M × 2 E
(Il y a plus, mais cela devrait suffire aux fins de cette discussion)
La mantisse n'est pas beaucoup plus qu'un nombre entier de 24 bits. Cela devient multiplié par 2 à la puissance de la partie exposant, qui, en gros, est un nombre compris entre −128 et 127.
Par conséquent, vous pouvez représenter avec précision tous les nombres qui tiendraient dans un entier de 24 bits, mais la plage numérique est également beaucoup plus grande car les exposants plus grands permettent des valeurs plus grandes. Par exemple, la valeur maximale pour un float
est d'environ 3,4 × 1038 alors que int
n'autorise que des valeurs jusqu'à 2,1 × 109.
Mais cela signifie également, puisque 32 bits n'ont que 4,2 × 109 différents états (qui sont tous utilisés pour représenter les valeurs que int
peut stocker), qu'à l'extrémité la plus large de la plage numérique de float
, les nombres sont plus espacés (car il ne peut y avoir plus unique float
que de numéros uniques int
). Vous ne pouvez donc pas représenter certains nombres exactement. Par exemple, le nombre 2 × 1012 a une représentation en float
de 1 999 999 991 808. Cela pourrait être fermer à 2 000 000 000 000 mais ce n'est pas exact. De même, l'ajout de 1 à ce nombre ne le modifie pas car 1 est trop petit pour faire une différence dans les plus grandes échelles que float
y utilise.
De même, vous pouvez également représenter de très petits nombres (entre 0 et 1) dans un float
, mais que les nombres soient très grands ou très petits, float
n'a qu'une précision d'environ 6 ou 7 chiffres décimaux. Si vous avez de grands nombres, ces chiffres sont au début du numéro (par exemple, 4,51534 × 1035, qui n'est rien de plus que 451534 suivi de 30 zéros - et float
ne peut rien dire d'utile sur le fait que ces 30 chiffres sont réellement des zéros ou autre chose), pour de très petits nombres (par exemple 3,14159 × 10−27) ils sont à l'extrémité du nombre, bien au-delà des chiffres de départ de 0,0000 ...
Les flottants sont utilisés pour stocker une plage de nombres plus large que celle pouvant être ajustée dans un entier. Il s'agit notamment des nombres décimaux et des nombres de style de notation scientifique qui peuvent être des valeurs plus grandes que celles pouvant tenir sur 32 bits. Voici la plongée profonde en eux: http://en.wikipedia.org/wiki/Floating_point