2012-12-01 9 views
0

Les nombres binaires décimaux peuvent également représenter des flottants. Maintenant, je lis que cela peut avoir des flotteurs du genreComment représenter un point flottant en binaire. IEEE

0.5: 0.1, 0.25: 0.01, 0.125: 0.001 ... et ainsi de suite. Mais alors, par exemple, comment le 0.1 (en décimal) est-il représenté en binaire?

De plus, étant donné un flottant décimal, comment le convertir en équivalent décimal, (étant donné que ce n'est pas si simple). Edit: Donc, je comprends que la meilleure question aurait été; comment convertir un flottant décimal en binaire? Maintenant je comprends que nous multiplions la partie décimale, jusqu'à ce qu'elle devienne zéro. Maintenant, il est très possible que deux points flottants peuvent avoir la même représentation droite?

Répondre

3

Étant donné le nombre de bits?

0.1b:

0.00011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011... 

Comme vous pouvez le voir est une approximation.

Binary           Decimal 
0.1  == 1/2^1   == 1/2    == 0.5 
0.01 == 1/2^2   == 1/4    == 0.25 
0.11 == 1/2^1 + 1/2^2 == 1/2 + 1/4 == 3/4 == 0.75 

Chaque bit après la radix point représente^1/2 (position_after_bit_string).

postion: |1|2|3|4|5|6|7| 
     0.|0|0|0|0|0|0|1| 

Alors 0.0000001 = 1/2^7 = 0.0078125

pseudocode:

decimal_value = 0 
for i, bit in enumerate(binary_string): 
    if bit == 1 
     decimal_value += 1/2**i 

Pour plus d'informations Why can't decimal numbers be represented exactly in binary?

+0

maintenant il est très possible que deux points flottants peuvent avoir la même représentation droite? –

+0

Non, une chaîne de 1 bit n'a qu'une valeur en utilisant cette représentation. –

+3

@Sahil: Lorsque les nombres sont convertis en virgule flottante (en analysant une chaîne contenant un nombre et en le convertissant en virgule flottante), des nombres différents peuvent produire le même résultat. Il est imprécis de dire que le résultat à virgule flottante représente ces nombres.Selon la norme IEEE 754, une valeur à virgule flottante représente précisément un nombre, celui que vous obtenez en interprétant son codage comme spécifié dans la norme. Vous pouvez dire que deux nombres différents peuvent avoir la même approximation en virgule flottante, mais il est important de se rappeler que c'est seulement une approximation. –

0

Une autre observation qui peut être utile. La 'partie entière' d'un nombre à virgule flottante est présente dans le binaire sous sa forme 'normale', par exemple si la valeur est 25.7482 vous aurez les bits '11001' (25) dans le point flottant, avec les bits suivants représentant la fraction (en fait le premier '1' n'est jamais stocké, c'est impliqué dans le format). Si vous soustrayez 25,0 de ce nombre, et multipliez par 10, vous obtenez 7,482, et en examinant la partie entière de cette valeur, vous pouvez obtenir le premier chiffre fractionnaire, '7'. Soustraire 7,0, multiplier par 10 donne 4,82, donc le chiffre suivant '4', et ainsi de suite.

En théorie, ce processus finira par aboutir à un résultat nul, puisque toutes les valeurs qui peuvent être exactement représentées au format à virgule flottante ont une représentation décimale exacte; cependant, ce résultat 'exact' pourrait avoir beaucoup plus de chiffres que ce qui est réellement raisonnable étant donné la précision du point flottant d'origine (et vous aurez peut-être besoin d'une précision interne pour obtenir ce résultat parfaitement exact). ne génère pas d'erreur d'arrondi). Et, pour des nombres comme 6.432e-200, cette méthode est réalisable mais pas très efficace (vous génèreriez 199 zéros avant que le premier '6' apparaisse).

Questions connexes