Quais são as aplicações / benefícios de um tipo de dados estendida precisão de 80 bits?

StackOverflow https://stackoverflow.com/questions/612507

  •  03-07-2019
  •  | 
  •  

Pergunta

Sim, eu quis dizer 80-bit . Isso não é um erro de digitação ...

A minha experiência com variáveis ??de ponto flutuante sempre envolveu múltiplos de 4 bytes, como singles (32 bits), duplos (64 bits), e duplas longos (que eu vi referido como tanto de 96 bits ou 128 bits ). É por isso que eu estava um pouco confuso quando me deparei com um 80-bit precisão estendida tipo de dados enquanto eu estava trabalhando em algum código para ler e gravar arquivos AIFF (AIFF) : um prolongado variável de precisão foi escolhido para armazenar a taxa de amostragem da faixa de áudio.

Quando eu desnatado através Wikipedia, eu encontrei o link acima, juntamente com uma breve menção de formatos de 80 bits no IEEE 754-1985 resumo padrão (mas não no IEEE padrão 754-2008 resumo). Parece que, em certas arquiteturas "estendida" e "long double" são sinônimos.

Uma coisa que eu não encontrei são aplicações específicas que fazem uso de tipos de dados de precisão estendida (exceto, é claro, taxas de amostragem arquivo AIFF). Isso me levou a pensar:

  • Alguém se deparar com uma situação onde estendida precisão era necessária / benéfico para alguma aplicação de programação?
  • Quais são os benefícios de um número de ponto flutuante de 80 bits, além do óbvio "que é um pouco mais precisão do que um duplo mas menos bytes do que a maioria das implementações de um long double"?
  • É a sua aplicabilidade em declínio?
Foi útil?

Solução

FPUs da Intel usam o formato de 80 bits internamente para obter mais precisão para os resultados intermediários.

Isto é, você pode ter variáveis ??de 32 bits ou de 64 bits, mas quando eles são carregados nos registradores FPU, eles são convertidos para 80 bits; FPU seguida (por defeito) realiza todos os cálculos em 80, mas; após o cálculo, o resultado é armazenado de volta em um variáveis ??de 32 bits ou de 64 bits.

Entre - Um pouco lamentável consequência disto é que depuração e compilações podem produzir resultados ligeiramente diferentes: na compilação de lançamento, o otimizador pode manter uma variável intermediária num registo FPU 80-bit, enquanto na compilação de depuração, ele será armazenado em uma variável de 64 bits, causando perda de precisão. Você pode evitar isso usando variáveis ??de 80 bits, ou usar um interruptor de FPU (ou opção do compilador) para executar todos os cálculos em 64 bits.

Outras dicas

Para mim, o uso de 80 bits é essencial. Desta forma eu recebo de alta ordem (30.000) valores e vectores próprios de matrizes simétricas com mais quatro números ao usar a biblioteca GOTO para vetor produtos internos, viz., 13 em vez de 9 algarismos significativos para o tipo de matrizes que eu uso no atômica relativista cálculos, o que é necessário para evitar a queda para o mar de estados negativo de energia. Minha outra opção é usar aritmética quadruple-precisão que aumenta o tempo de CPU 60-70 vezes e também aumenta requisitos de RAM. Qualquer cálculo contando com produtos internos de grandes vetores serão beneficiados. Claro, a fim de manter os resultados do produto interno parciais dentro de registros é necessário usar assembler linguagem, como nas bibliotecas Goto. É assim que eu aprendi a amar meus antigos processadores Opteron 850, que eu vou estar usando o tempo que duram por parte dos meus cálculos.

A razão 80 bits é rápido, ao passo que uma maior precisão é muito mais lento, é que o hardware de ponto flutuante padrão da CPU tem registos de 80 bits. Portanto, se você quiser que os extra de 16 bits (11 bits extras de mantissa, quatro bits extras de expoente e um bit extra de forma eficaz não utilizado), então ele realmente não te custar muito para estender de 64 para 80 bits - que, para estender além de 80 bits é extremamente dispendiosa em termos de tempo de execução. Então, assim como você pode usar precisão de 80 bits, se você quiser. Não é para uso sem custo, mas se trata muito barato.

Wikipedia explica que um formato de 80 bits pode representar um número inteiro de 64-bit inteiro sem perder em formação. Assim, a unidade de ponto flutuante do CPU pode ser usado para implementar multiplicação e divisão de números inteiros.

Outra vantagem ainda não mencionada para tipos de 80 bits é que em processadores de 16 bits ou de 32 bits que não têm unidades de ponto flutuante, mas não têm um "multiplicar" de instruções que produz um resultado duas vezes tão longo como o operandos (16x16-> 32 ou 32x32-> 64), aritméticas sobre uma mantissa 64 bits subdividida em quatro ou dois registos de 16 bits ou de 32 bits será mais rápido do que em aritmética uma mantissa 53 bits que atravessa o mesmo número de registros, mas tem que dividir 12 bits registrar com o sinal e expoente. Para aplicações que não precisam de nada mais preciso do que float, cálculos em um 48-bit "estendida flutuar" tipo poderia também ser mais rápido do que os cálculos em um 32-bit float.

Enquanto algumas pessoas podem lamentar o comportamento double-arredondamento de tipos de precisão estendida, que é realisticamente falando apenas um problema em aplicações especializadas que exigem completo reprodutibilidade cross-platform bit-exato. De um precisão ponto de vista, a diferença entre um erro de arredondamento de 64/128 vs 65/128 ou 1024 / 2048ulp vs 1025/2048, é um não-problema; em línguas com tipos de variáveis ??de precisão estendida e semântica estendida de precisão consistentes , o uso de tipos estendidos em muitas plataformas sem hardware de ponto flutuante (por exemplo, sistemas embarcados) vai oferecer tanto maior precisão e maior velocidade do que os tipos de ponto flutuante simples ou dupla precisão.

Eu usei 80 bits para uma pesquisa de matemática pura. Eu tivesse que resumir termos em uma série infinita que cresceu muito grande, fora da faixa de duplas. Convergência e precisão não eram preocupações, apenas a capacidade de lidar com grandes expoentes como 1E1000. Talvez alguns álgebra inteligente poderia ter simplificado as coisas, mas foi maneira mais rápida e mais fácil de apenas um código um algoritmo com precisão estendida, do que gastar algum tempo pensando sobre isso.

Eu tenho um amigo que está trabalhando nisso. Ele está trabalhando em uma biblioteca para lidar com pontos flutuantes do tamanho de gigabytes. Claro, é algo relacionado com computação científica (cálculos com plasma), e, provavelmente, só este tipo de obras de computação com números tão grande ...

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