Como representar ponto flutuante em binário. IEEE

similares aos números binários decimais podem ter também flutuantes. Agora eu li que ele pode ter flutuadores do tipo

0.5:0.1 , 0.25:0.01 , 0.125:0.001 ... e assim por diante. Mas então, por exemplo, como é o 0.1(em decimal) representado em binário?

também, dada uma vírgula flutuante, como convertê-la ao equivalente decimal, (dado que não é tão simples).

Editar: então eu entendo que a melhor pergunta teria sido : como converter uma vírgula flutuante para binário? Agora percebo que multiplicamos a parte decimal, até que se torne zero. Agora é muito possível que duas pontas flutuantes possam ter a mesma representação, certo?

Author: Chris Seymour, 2012-12-01

2 answers

Em quantos pedaços?

0, 1 b:

0.00011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011001100110011...
Como podes ver, é uma aproximação.
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

Cada bit após o ponto de radix representa 1/2^(position_after_bit_string).

postion:   |1|2|3|4|5|6|7|
         0.|0|0|0|0|0|0|1|
Então ... 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

Para mais informações porque é que os números decimais não podem ser representados exactamente em binário?

 3
Author: Chris Seymour, 2017-05-23 12:31:22
Outra observação que pode ser útil. A 'parte inteira de um número de ponto flutuante está presente em binário no seu "normal" de formulário, por exemplo, se o valor é 25.7482 você vai ter os bits '11001' (25) em ponto flutuante, com os bits seguintes representam a fração (na verdade, o primeiro '1' nunca é armazenado, é expressa no formato). Se você subtrair 25.0 desse número, e multiplicar por 10, você obtém 7.482, e examinando a parte inteira desse valor, você pode obter o primeiro dígito fraccional, "7".

Subtraia 7.0, multiplique por 10 dá 4.82, assim o dígito seguinte '4', e assim por diante. Este processo será, em teoria final, eventualmente, com um resultado zero, uma vez que todos os valores que podem ser exatamente o representado no formato de ponto flutuante de ter uma exata representação decimal; no entanto, que "exatas" resultado poderia ter muito mais dígitos do que são, na verdade, razoável, dada a precisão do original de ponto flutuante (e você pode precisar de precisão internamente para obter esse resultado totalmente exato, de qualquer forma-você precisa garantir que a multiplicação por 10 não gera um erro de arredondamento).

E, para números como 6.432 e-200, este método é exequível, mas não muito eficiente (estaria a gerar 199 zeros antes do primeiro '6' emergir).

 0
Author: greggo, 2012-12-22 19:44:14