Entendendo a saída do utilitário od em relação a floats 'od -t f'

2

Estou fazendo meu próprio utilitário baseado na especificação Single UNIX e estou confuso sobre como a representação de floats é tratada, por exemplo, %código%. Eu tenho um utilitário funcionando perfeitamente de outra forma que é capaz de lidar com todas as outras partes da especificação também esta não é uma questão de programação, mas uma questão sobre o significado da saída ao despejar como um float.

Por exemplo, se eu executar o seguinte programa fornecendo para stdin os caracteres ASCII A \ n , recebo o seguinte:

$ od -A n -t fD -
               1.297e-320

Se eu fornecer apenas A

$ od -A n -t fD -
                 3.2e-322

Eu sei que o valor para os caracteres A e newline são 65 e 10 respectivamente, então não tenho idéia do que significam esses números exponencialmente pequenos no contexto. A especificação não dá muita cobertura aos carros alegóricos, então eu apreciaria qualquer informação sobre este ponto.

    
por Zeno of Elea 05.10.2018 / 12:40

1 resposta

2

Em sistemas little-endian, esse é o resultado da representação de strings, floats e duplas na memória. Começando com "A", 65, ou 0x41, como float ( od -t fF ), isso corresponde a

00000000000000000000000001000001

que é 9.1⋅10 -44 (consulte este útil conversor ) - um bit 0 para o sinal (positivo), 0 expoente (que é polarizado, por -126 para um float) e uma fração, 2 -17 + 2 -23 . O valor representado é assim (2 -17 + 2 -23 ) x2 -126 (veja Wolfram Alpha ). Adicionando uma nova linha produz

00000000000000000000101001000001

que é 3.678⋅10 -42 .

O uso de duplas ( od -t fD ) adiciona mais quatro bytes de zeros à frente do número, o que não altera o sinal nem o expoente, e reduz a fração ainda mais, o que, além do maior viés de duplas (- 1022), resulta nos números muito pequenos que você vê (veja este outro conversor que usa duplas ): “A” é (2 -46 + 2 -52 ) × 2 -1022 (veja Wolfram Alpha )," A "seguido por uma nova linha é (2 -41 + 2 -43 + 2 -46 + 2 -52 ) × 2 -1022 (consulte Wolfram Alpha ).

    
por 05.10.2018 / 14:06