Pergunta

No seguimento de essa questão, parece que alguns números não podem ser representados por ponto flutuante e, em vez disso, são aproximados.

Como os números de ponto flutuante são armazenados?

Existe um padrão comum para os diferentes tamanhos?

Que tipo de pegadinhas preciso observar se usar ponto flutuante?

Eles são compatíveis com vários idiomas (ou seja, com quais conversões preciso lidar para enviar um número de ponto flutuante de um programa python para um programa C por TCP/IP)?

-Adão

Foi útil?

Solução

Como mencionado, o Artigo da Wikipédia sobre IEEE 754 faz um bom trabalho ao mostrar como os números de ponto flutuante são armazenados na maioria dos sistemas.

Agora, aqui estão algumas dicas comuns:

  • A maior é que você quase nunca deseja comparar dois números de ponto flutuante quanto à igualdade (ou desigualdade).Você desejará usar comparações maior que/menor que.
  • Quanto mais operações você fizer em um número de ponto flutuante, mais significativos poderão ser os erros de arredondamento.
  • A precisão é limitada pelo tamanho da fração, portanto, talvez você não consiga somar corretamente números separados por várias ordens de magnitude.(Por exemplo, você não poderá adicionar 1E-30 a 1E30.)

Outras dicas

Uma explicação completa das questões relacionadas aos números de ponto flutuante é fornecida no artigo O que todo cientista da computação deve saber sobre aritmética de ponto flutuante.

O padrão é IEEE 754.

Claro, existem outros meios de armazenar números quando o IEE754 não é bom o suficiente.Bibliotecas como Java BigDecimal estão disponíveis para a maioria das plataformas e são bem mapeados para o tipo de número do SQL.Os símbolos podem ser usados ​​para números irracionais, e as proporções que não podem ser representadas com precisão em ponto flutuante binário ou decimal podem ser armazenadas como uma proporção.

Quanto à segunda parte da sua pergunta, a menos que desempenho e eficiência sejam importantes para o seu projeto, sugiro que você transfira os dados de ponto flutuante como uma string por TCP/IP.Isso permite evitar problemas como alinhamento de bytes e facilitará a depuração.

Basicamente, o que você precisa se preocupar em números de ponto flutuante é que há um número limitado de dígitos de precisão.Isso pode causar problemas ao testar a igualdade ou se o seu programa realmente precisar de mais dígitos de precisão do que aquele tipo de dados fornece.

Em C++, uma boa regra é pensar que um float fornece 7 dígitos de precisão, enquanto um double fornece 15.Além disso, se você estiver interessado em saber como testar a igualdade, você pode consultar esse tópico de perguntas.

Em acompanhamento dessa questão, parece que alguns números não podem ser representados por ponto flutuante e, em vez disso, são aproximados.

Correto.

Como os números de ponto flutuante são armazenados?Existe um padrão comum para os diferentes tamanhos?

Como os outros pôsteres já mencionados, quase exclusivamente IEEE754 e seu sucessor IEEE754R.Pesquisando no Google, você obtém milhares de explicações, juntamente com padrões de bits e suas explicações.Se você ainda tiver problemas para obtê-lo, ainda existem dois formatos FP comuns:IBM e DEC-VAX.Para algumas máquinas e compiladores esotéricos (Blitzbasic, Turbopascal), existem alguns formatos ímpares.

Que tipo de pegadinhas preciso observar se usar ponto flutuante?Eles são compatíveis com o idioma cruzado (ou seja, quais conversões eu preciso lidar para enviar um número de ponto flutuante de um programa Python para um programa C sobre TCP/IP)?

Praticamente nenhum, eles são compatíveis com vários idiomas.

Peculiaridades muito raras:

  • IEEE754 define sNaNs (sinalização NaNs) e qNaNs (silencioso NaNs).Os primeiros causam uma armadilha que força o processador a chamar uma rotina de tratamento se estiver carregado.Estes últimos não fazem isso.Como os designers de linguagem odiavam a possibilidade de os sNaNs interromperem seu fluxo de trabalho e apoiá-los impor o suporte às rotinas do manipulador, os sNaNs são quase sempre convertidos silenciosamente em qNaNs.Portanto, não confie em uma conversão bruta 1:1.Mas novamente:Isso é muito raro e ocorre apenas se estiver presente os que estão presentes.

  • Você pode ter problemas com endianness (os bytes estão na ordem errada) se arquivos entre computadores diferentes forem compartilhados.É facilmente detectável porque você está obtendo NaNs para números.

Sim, existe o Padrão IEEE para aritmética binária de ponto flutuante (IEEE 754)

O número é dividido em três partes, sinal, expoente e fração, quando armazenado em binário.

Esse artigo intitulado "Números de ponto flutuante IEEE Standard 754" pode ser útil.Para ser honesto, não tenho certeza se estou entendendo sua pergunta, então não tenho certeza se isso será útil, mas espero que seja.

Se você está realmente preocupado com erros de arredondamento de ponto flutuante, a maioria das linguagens oferece tipos de dados que não possuem erros de ponto flutuante.O SQL Server possui os tipos de dados Decimal e Money..Net possui o tipo de dados Decimal.Eles não têm precisão infinita como BigDecimal em Java, mas são precisos até o número de casas decimais para os quais são definidos.Portanto, você não precisa se preocupar com um valor em dólar digitado como $ 4,58 sendo salvo como um valor de ponto flutuante de 4,579999999999997

O que me lembro é que um ponto flutuante de 32 bits é armazenado usando 24 bits para um número real, e os 8 bits restantes são usados ​​como uma potência de 10, determinando onde está o ponto decimal.

Estou um pouco enferrujado nesse assunto...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top