Pergunta

Existem situações em que faria mais sentido usar um único tipo de dados em vez de um duplo? De minha pesquisa, a desvantagem de um duplo é que ele requer mais espaço, o que não é um problema para a maioria das aplicações. Nesse caso, deve todos os números de ponto flutuante ser duplos?

Um pouco de informação de fundo: Eu estou trabalhando com um aplicativo que lida com um monte de dados sobre coordenadas e produtos químicos. Alguns clientes têm notado que ao importar planilhas de dados, alguns valores com alta precisão são arredondados para baixo a precisão de um único.

Foi útil?

Solução

Na maioria dos aplicativos de desktop, sim.

Embora se você tem uma enorme variedade de-los, reduzir para metade o tamanho do que poderia ser significativo o suficiente para valer a pena se você não precisa a precisão.

Especialmente tendo em conta que praticamente todos os desktops de consumo têm de precisão dupla de ponto flutuante aritmética feito em hardware.

Outras dicas

A partir este .net artigo

Tipo de dados Largura

Os tipos de dados mais eficientes são aqueles que utilizam a largura de dados nativa da plataforma de tempo de execução. na atual plataformas, os dados de largura é de 32 bits, tanto para o computador ea sistema operacional.

Por isso, Integer é atualmente o a maioria dos tipos de dados eficiente no Visual Basic .NET. Próxima melhor são Longo, Curto, e Byte, em que a ordem de eficácia. Você pode melhorar o desempenho de Curta e Byte desligando inteiro verificação de estouro, por exemplo, definindo as RemoveIntegerChecks propriedade, mas isso incorre no risco de cálculos incorrectos devido aos overflows não detectados. Você não pode alternar esta verificação dentro e fora durante tempo de execução; você só pode definir o seu valor para a próxima compilação do seu aplicação.

Se você precisar de valores fracionários, os melhor escolha é duplo, porque o Os processadores de ponto flutuante de corrente plataformas de realizar todas as operações em dupla precisão. Próxima melhor são Individual e decimal, em que a ordem de eficiência.

Como Mark diz em seu comentário, o espaço pode ser um problema em sistemas com restrição de memória. Você também pode querer índice ou classificar uma lista, e por que fazer isso em duplas, se você pode armazenar seus valores em singles?

Em algum hardware, que envolvam valores duplos aritméticas pode levar mais tempo do que aquele que envolve valores únicos, mas a maioria das FPUs recentes têm um único tipo de dados nativa (por exemplo, 80 bits estendido valores de pontos para 86 flutuante), que vai ser utilizados internamente para cálculos independentemente dos dados que na memória tipo você está usando. Então quer dizer que "os cálculos FPU será mais rápido com precisão simples" é geralmente não a razão para usar de precisão simples na maioria dos hardwares moderna hoje.

Dito isso, além dos "usa menos memória" razões elaborados nos demais respostas, há uma razão muito prática quando se trata de instruções vetoriais SIMD como SSE e AltiVec - single precisão é likey ser duas vezes mais rápido como precisão dupla, já que as instruções operam em vetores de tamanho fixo, e você pode encher o dobro de valores de precisão simples em um único vetor, com o tempo de processamento normalmente permanecendo o mesmo.

Por exemplo, com uma unidade de vetor de 128 bits capaz de processar multiplicações vetoriais em 2 ciclos de relógio, você poderá obter um rendimento de 2 multiplicações precisão única por clock, versus 1 precisão dupla, desde que você pode 4 singles em um vetor, contra duas duplas.

Um efeito semelhante ocorre com largura de banda de memória, e não é específico para processamento de vetor - se você tem grandes conjuntos de duplas, eles não vão ter apenas o dobro do espaço, mas pode levar até duas vezes mais tempo para processo no caso em que seu algoritmo é largura de banda restrita (que é cada vez mais provável, dadas as crescentes tamanhos e latências decrescentes de unidades de processamento de vetor).

Duplas tomar mais espaço, mas a precisão extra pode ou não ser necessário. Eu fiz um monte de programação no mundo científico, onde aritmética de ponto flutuante é muito comum e descobriram que muitas vezes você pode fazer os cálculos de precisão dupla ou superior, mas armazenar os resultados como solteiros sem efeito doente.

Tenha em mente que uma vez que os números são sugados para a FPU, eles são expandidos para muito alta precisão de qualquer maneira. Dito isto, seria melhor tentar o que você está fazendo em ambas as precisões e ver se os resultados são comparáveis.

Infelizmente, computação ainda é uma ciência experimental.

Se você está codificando OpenGL, então é normal usar GLSingle (por exemplo único) em vez de GLDouble. Em quase todas as circunstâncias precisão simples é mais do que suficiente para a maioria das aplicações gráficas e deve ser mais rápido - embora confesso que não estou certo disso na mais recente geração de GPUs.

A minha citação favorita sobre isso é que precisão simples foi suficiente para navegar até a lua e voltar, por isso, na prática, é incomum para causar um problema real. Dito isto na maioria das circunstâncias eu chegar para um double hoje em dia como o armazenamento é barato e há menos probabilidade de ser qualquer binário estranho para questões decimais.

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