Quando você usa float e quando usa double

185

Freqüentemente, na minha experiência em programação, preciso tomar uma decisão sobre se devo usar float ou double para meus números reais. Às vezes eu vou para flutuar, às vezes eu vou para o dobro, mas realmente isso parece mais subjetivo. Se eu fosse confrontado para defender minha decisão, provavelmente não daria boas razões.

Quando você usa float e quando você usa o dobro? Você sempre usa o dobro, somente quando as restrições de memória estão presentes você vai para o float? Ou você usa sempre flutuar, a menos que o requisito de precisão exija que você use o dobro? Existem algumas diferenças substanciais em relação à complexidade computacional da aritmética básica entre float e double? Quais são os prós e contras do uso de float ou double? E você já usou muito tempo duplo?

    
por Jakub Zaverka 28.02.2013 / 11:35
fonte

7 respostas

176

A opção padrão para um tipo de ponto flutuante deve ser double . Esse também é o tipo que você obtém com literais de ponto flutuante sem um sufixo ou (em C) funções padrão que operam em números de ponto flutuante (por exemplo, exp , sin , etc.).

float só deve ser usado se você precisar operar em vários números de ponto flutuante (pense na ordem de milhares ou mais) e a análise do algoritmo mostrou que a faixa e a precisão reduzidas não representam um problema.

long double pode ser usado se você precisar de mais alcance ou precisão do que double e se ele fornecer isso em sua plataforma de destino.

Em resumo, float e long double devem ser reservados para uso pelos especialistas, com double para uso "todos os dias".

    
por 28.02.2013 / 11:50
fonte
41

Raramente há o uso de float em vez de duplicar no código destinado a computadores modernos. A precisão extra reduz (mas não elimina) a chance de erros de arredondamento ou outras imprecisões que causam problemas.

As principais razões pelas quais posso pensar em usar o float são:

  1. Você está armazenando grandes matrizes de números e precisa reduzir sua consumo de memória do programa.
  2. Você está direcionando um sistema que não suporta originalmente ponto flutuante de precisão dupla. Até recentemente, muitas placas gráficas suportavam apenas uma precisão pontos flutuantes. Tenho certeza que há abundância de baixa potência e processadores embarcados que também têm suporte limitado a ponto flutuante.
  3. Você está direcionando hardware onde a precisão simples é mais rápida de precisão dupla, e seu aplicativo faz uso pesado de aritmética de ponto flutuante. Nos modernos processadores da Intel, acredito que cálculos de ponto flutuante são feitos com precisão dupla, então você não ganha nada aqui.
  4. Você está fazendo otimização de baixo nível por exemplo, usando instruções especiais da CPU que operam em múltiplos números de cada vez.

Portanto, basicamente, o dobro é o caminho a percorrer, a menos que você tenha limitações de hardware ou, a menos que a análise tenha mostrado que o armazenamento de números de precisão dupla esteja contribuindo significativamente para o uso da memória.

    
por 01.03.2013 / 01:28
fonte
10

Use double para todos os seus cálculos e variáveis temporárias. Use float quando precisar manter uma matriz de números - float[] (se a precisão for suficiente) e você estiver lidando com mais de dezenas de milhares de float números.

Muitas / mais funções matemáticas ou operadores convertem / retornam double , e você não deseja converter os números de volta para float para quaisquer etapas intermediárias.

Por exemplo Se você tiver uma entrada de 100.000 números de um arquivo ou um fluxo e precisar classificá-los, coloque os números em float[] .

    
por 28.02.2013 / 21:11
fonte
5

Algumas plataformas (ARM Cortex-M2, Cortex-M4, etc) não suportam duplo (sempre pode ser verificado no manual de referência para o seu processador. Se não houver avisos ou erros de compilação) , isso não significa que o código é ótimo. duplo pode ser emulado.). É por isso que você precisa manter o int ou o float .

Se esse não for o caso, eu usaria double .

Você pode conferir o famoso artigo de D. Goldberg ("O que todo cientista da computação deve saber sobre a aritmética de ponto flutuante"). Você deve pensar duas vezes antes de usar a aritmética de ponto flutuante. Há uma grande chance de que eles não sejam necessários em sua situação particular.

link

    
por 22.09.2014 / 22:48
fonte
3

Para problemas do mundo real, o limite de amostragem de seus dados é importante para responder a essa pergunta. Da mesma forma, o piso de ruído também é importante. Se um dos dois for excedido por sua seleção de tipo de dados, nenhum benefício virá do aumento da precisão.

A maioria dos samplers do mundo real está limitada a DACs de 24 bits. Sugerindo que 32 bits de precisão em cálculos do mundo real devem ser adequados onde o significand é de 24 bits de precisão.

A precisão dupla tem o custo de 2x de memória. Portanto, limitar o uso de duplas sobre floats pode reduzir drasticamente o consumo de memória / largura de banda de aplicativos em execução.

    
por 19.08.2014 / 18:50
fonte
-3

A escolha de qual variável usar entre float e double depende da precisão dos dados exigidos. Se uma resposta for necessária para ter uma diferença desprezível em relação à resposta real, o número de casas decimais necessárias será muito, portanto, ditará que o dobro deve estar em uso. A Float cortará algumas partes decimais, reduzindo assim a precisão.

    
por 07.02.2015 / 11:33
fonte
-5

Normalmente, eu uso o tipo float quando não preciso de muita precisão - por exemplo, por dinheiro - o que é errado, mas é o que estou acostumado a fazer de forma errada.

Por outro lado, eu uso double quando preciso de mais precisão, por exemplo, para algoritmos matemáticos complexos.

O padrão C99 diz isso:

There are three floating point types: float, double, and long double. The type double provides at least as much precision as float, and the type long double provides at least as much precision as double. The set of values of the type float is a subset of the set of values of the type double; the set of values of the type double is a subset of the set of values of the type long double.

Eu nunca usei long double , mas não uso C / C ++. Geralmente eu uso linguagens tipificadas dinamicamente como Python, onde você não precisa se preocupar com os tipos.

Para mais informações sobre Double vs Float , consulte esta pergunta em SO .

    
por 28.02.2013 / 11:49
fonte