Pergunta

Quais são as vantagens e desvantagens de usar um em vez do outro em C ++?

Foi útil?

Solução

Se você quiser saber a resposta verdadeira, você deve ler O que cada cientista computador deve saber sobre Floating-Point Arithmetic .

Em suma, embora double permite maior precisão em sua representação, para certos cálculos que iria produzir erros maiores . A escolha "certa" é:. uso tanta precisão quanto você precisa, mas não mais e escolher o algoritmo de direito

Muitos compiladores fazer estendido matemática de ponto flutuante no modo de "não rigorosa" de qualquer maneira (isto é usar um tipo de ponto mais largo flutuante disponível em hardware, por exemplo, 80 bits e 128 bits flutuantes), isto deve ser levado em conta como bem. Na prática, você pode quase não vê qualquer diferença na velocidade - eles são nativos para hardware de qualquer maneira

.

Outras dicas

A menos que tenha alguma razão específica para fazer o contrário, use dupla.

Talvez surpreendentemente, é dupla e não flutuam que é do tipo "normal" de ponto flutuante em C (e C ++). As funções matemáticas padrão, como sin e log tomar duplas como argumentos, e duplas de retorno. Um literal de ponto flutuante normal, como quando você escreve 3,14 em seu programa, tem o tipo de casal. Não flutuar.

Em computadores típicos modernos, duplos pode ser tão rápido como carros alegóricos, ou mesmo mais rápido, por isso o desempenho não é geralmente um fator a considerar, mesmo para grandes cálculos. (E aqueles teria que ser grande cálculos, ou o desempenho não deve mesmo entrar na sua mente. Meu novo computador desktop i7 pode fazer seis bilhões de multiplicações de duplas em um segundo.)

Esta questão é impossível de responder, pois não há contexto para a pergunta. Aqui estão algumas coisas que podem afetar a escolha:

  1. implementação Compiler de carros alegóricos, duplas e duplas de comprimento. O C ++ estados padrão:

    Existem três tipos ponto flutuante: float, double e long double. O tipo fornece o dobro, pelo menos, tanta precisão quanto float, eo tipo fornece long double pelo menos tanta precisão quanto o dobro.

    Assim, todos os três podem ser do mesmo tamanho na memória.

  2. A presença de uma FPU. Nem todas as CPUs têm FPUs e às vezes os tipos de ponto flutuante são emulados e às vezes os tipos de ponto flutuante simplesmente não são suportadas.

  3. FPU Architecture. FPU do IA32 é 80bit internamente - flutuadores 32 bits e 64 bits são expandidos para 80bit da carga e redução na loja. Há também SIMD que pode fazer quatro 32bit flutuadores ou duas bóias de 64 bits em paralelo. Uso de SIMD não está definido no padrão, por isso exigiria um compilador que faz análise mais complexa para determinar se SIMD pode ser usado, ou requer o uso de funções especiais (bibliotecas ou intrínsecos). O resultado do formato interno 80bit é que você pode obter resultados ligeiramente diferentes dependendo de quantas vezes os dados são salvos em RAM (assim, perder precisão). Por esta razão, os compiladores não otimizar flutuante código de ponto particularmente bem.

  4. Memória largura de banda. Se um duplo requer mais espaço de armazenamento do que um float, então vai demorar mais tempo para ler os dados. Essa é a resposta ingênua. Em um IA32 moderna, tudo depende de onde os dados são provenientes. Se está em cache L1, a carga é insignificante desde que os dados vem de uma única linha de cache. Se ele se estende por mais de uma linha de cache há uma pequena sobrecarga. Se é de L2, leva um tempo mais longo, se é na RAM, então é ainda mais longo e, finalmente, se é no disco que é um tempo enorme. Assim, a escolha de float ou duplo é menos importante do que a forma como os dados são usados. Se você quer fazer um pequeno cálculo em lotes de dados sequenciais, um pequeno tipo de dados é preferível. Fazendo um monte de computação em um pequeno conjunto de dados que permitem que você use tipos de dados maiores com qualquer efeito significativo. Se você estiver acessando os dados muito aleatoriamente, em seguida, a escolha do tamanho de dados não é importante - os dados são carregados em páginas / linhas de cache. Assim, mesmo se você só quer um byte de RAM, você pode obter 32 bytes transferidos (isto é muito dependente da arquitetura do sistema). Em cima de tudo isso, a CPU / FPU poderia ser super-escalar (aka pipeline). Assim, mesmo que uma carga pode demorar vários ciclos, o CPU / FPU poderia ser ocupado fazendo outra coisa (a multiplicar por exemplo) que esconde o tempo de carregamento de um grau.

  5. A norma não impõe qualquer formato particular para valores de ponto flutuante.

Se você tem uma especificação, em seguida, que irá guiá-lo para a escolha ideal. Caso contrário, é para baixo a experiência sobre o que usar.

Duplo é mais preciso, mas é codificado em 8 bytes. flutuador é de apenas 4 bytes, assim menos espaço e menos precisão.

Você deve ter muito cuidado se você tem o dobro e flutuar na sua aplicação. Eu tinha um bug devido a que no passado. Uma parte do código foi usando bóia enquanto o resto do código estava usando dupla. Copiando dupla para flutuar e flutuar para erro de precisão pode causar casal que pode ter grande impacto. No meu caso, foi uma fábrica de produtos químicos ... espero que ele não teve consequências dramáticas:)

Eu acho que é por causa deste tipo de bug que o foguete Ariane 6 explodiu há alguns anos !!!

Pense cuidadosamente sobre o tipo a ser usado para uma variável

Eu, pessoalmente, ir para o dobro o tempo todo até que eu veja alguns gargalos. Então eu considerar a mudança para float ou otimizar alguma outra parte

Isso depende de como os implementos compilador dobrar. É legal para casal e float para ser do mesmo tipo (e é em alguns sistemas).

Dito isto, se eles são realmente diferentes, a questão principal é a precisão. A dupla tem uma precisão muito maior devido à sua diferença de tamanho. Se os números que estão usando comumente irá exceder o valor de um flutuador, em seguida, usar um duplo.

Várias outras pessoas mencionados isssues desempenho. Isso seria exatamente o último na minha lista de considerações. Correção deve ser a sua # 1 consideração.

Use o que a precisão é necessária para atingir os resultados apropriados . Se você, em seguida, descobrir que seu código não está funcionando tão bem quanto você gostaria (que usou de perfil correto?) Dar uma olhada em:

Eu acho que, independentemente das diferenças (que como todos aponta, carros alegóricos ocupam menos espaço e são em geral mais rápido) ... alguém já sofrem problemas de desempenho usando o dobro? Eu digo usar o dobro ... e se mais tarde você decidir "uau, isso é realmente lento" ... encontrar o seu gargalo de desempenho (que provavelmente não é o fato de que você usou duplo). Depois, se ainda é demasiado lento para você, ver onde você pode sacrificar alguma precisão e uso float.

A principal diferença entre float e double é a precisão. Wikipedia tem mais informações sobre precisão simples (float) e Double precisão .

Ele depende muito da CPU a maioria dos trade-offs óbvias são entre precisão e memória. Com GBs de RAM, a memória não é muito de um problema, por isso é geralmente melhor doubles de uso.

Quanto ao desempenho, isso depende muito da CPU. floats normalmente irá obter um melhor desempenho do que doubles em uma máquina de 32 bits. Em 64 bits, doubles são, por vezes mais rápido, uma vez que é (geralmente) o tamanho nativo. Ainda assim, o que importa muito mais do que a sua escolha de tipos de dados é se você pode ou não tirar proveito de instruções SIMD em seu processador.

dupla tem maior precisão, enquanto que flutua ocupam menos memória e são mais rápidos. Em geral, você deve usar flutuador menos que você tenha um caso em que não é suficiente preciso.

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