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?
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?
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).