Freqüentemente em minha experiência de programação eu preciso tomar uma decisão se devo usar float ou double para meu real números. Às vezes eu vou para o float, à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 double? Você sempre usa double, apenas quando as restrições de memória estão presentes você vai para float? Ou você usa always float, a menos que o requisito de precisão exija que você use double? Existem algumas diferenças substanciais em relação à complexidade computacional da aritemática básica entre float e double? Quais são os prós e os contras de usar float ou double? E você já usou long double?

Comentários

  • Em muitos casos, você não deseja usar nenhum dos dois, mas sim um tipo decimal flutuante ou ponto fixo. Os tipos de ponto flutuante binários podem ‘ representar a maioria dos decimais exatamente.
  • Relacionado a O que causa erros de arredondamento de ponto flutuante ? . @CodesInChaos minha resposta sugere recursos para ajudá-lo a fazer essa determinação, não existe uma solução tamanho único .
  • O que exatamente você quer dizer com ” decimais “. Se você precisa representar valores como 0,01 exatamente (digamos, para dinheiro), então o ponto flutuante (binário) não é a resposta. Se você quer dizer apenas números não inteiros, o ponto flutuante provavelmente está ok – mas então ” decimais ” não é a melhor palavra para descrever o que você precisa.
  • Considerando (a partir de hoje) a maioria das placas gráficas aceita flutuadores em vez de duplos, a programação gráfica geralmente usa precisão única.
  • Você não ‘ t sempre tenho uma escolha. Por exemplo, na plataforma Arduino, double e float equivalem a float. Você precisa encontrar uma biblioteca adicional para lidar com duplicatas reais.

Resposta

A escolha padrão para um o tipo de ponto flutuante deve ser double. Este 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 em a ordem de milhares ou mais) e a análise do algoritmo mostrou que o alcance e a precisão reduzidos não representam um problema.

long double pode ser usado se você precisa de mais alcance ou precisão do que double e se for fornecido em sua plataforma de destino.

Em resumo, float e long double devem ser reservados para uso por especialistas, com double para uso “todos os dias”.

Comentários

  • Eu provavelmente não consideraria float para alguns milhares de valores, a menos que houvesse um problema de desempenho relacionado ao cache de ponto flutuante ge transferência de dados. Geralmente, há um custo substancial para fazer a análise para mostrar que o float é preciso o suficiente.
  • Como um adendo, se você precisa de compatibilidade com outros sistemas, pode ser vantajoso usar os mesmos tipos de dados.
  • I ‘ d uso floats para milhões de números, não 1000s. Além disso, algumas GPUs se saem melhor com floats, nesse caso específico, use floats. Caso contrário, como você disse, use duplos.
  • @PatriciaShanahan – ‘ problema de desempenho relacionado a .. ‘ A um bom exemplo é se você está planejando usar SSE2 ou instruções de vetor semelhantes, você pode fazer 4 ops / vetor em float (vs 2 por double), o que pode dar uma melhoria significativa na velocidade (metade das ops e metade dos dados para ler & gravação). Isso pode diminuir significativamente o limite em que o uso de flutuadores se torna atraente e vale a pena resolver os problemas numéricos.
  • Eu endosso esta resposta com um conselho adicional: quando alguém está operando com valores RGB para exibição, é aceitável usar float (e ocasionalmente meia precisão) porque nem o olho humano, a tela ou o sistema de cores tem tantos bits de precisão. Este conselho é aplicável, digamos, para OpenGL etc. Este conselho adicional não se aplica a imagens médicas, que têm requisitos de precisão mais estritos.

Resposta

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

Os principais motivos que posso imaginar para usar o float são:

  1. Você está armazenando grandes matrizes de números e precisa reduzir o consumo de memória do seu programa.
  2. Você tem como alvo um sistema que não oferece suporte nativo para ponto flutuante de dupla precisão. Até recentemente, muitas placas gráficas suportavam apenas pontos flutuantes de precisão simples. Tenho certeza de que há muitos processadores embutidos e de baixo consumo que também têm suporte de ponto flutuante limitado.
  3. Você está almejando um hardware onde a precisão única é mais rápida do que a precisão dupla e seu aplicativo faz uso intenso de aritmética de ponto flutuante. Em CPUs modernas da Intel, acredito que todos os cálculos de ponto flutuante são feitos em precisão dupla, então você não ganha nada aqui.
  4. Você está fazendo uma otimização de baixo nível, por exemplo, usando instruções especiais de CPU que operam em vários números ao mesmo tempo.

Então, basicamente, o dobro é o caminho para vá 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 está contribuindo significativamente para o uso de memória.

Comentários

  • ” Computadores modernos ” significando processadores Intel x86. Algumas das máquinas que os Antigos usavam forneciam precisão perfeitamente adequada com o tipo de flutuador básico. (O CDC 6600 usava uma palavra de 60 bits, 48 bits de mantissa de ponto flutuante normalizada, 12 bits de expoente. Isso ‘ é QUASE o que o x86 oferece para precisão dupla.)
  • @ John.R.Strohm: concordado, mas os compiladores C não existiam no CDC6600. Era Fortran IV …
  • Por ” computadores modernos ” Quero dizer qualquer processador construído na última década ou dois, ou realmente, já que o padrão de ponto flutuante IEEE foi amplamente implementado. Eu ‘ estou perfeitamente ciente de que existem arquiteturas não x86 e tive isso em mente na minha resposta – mencionei GPUs e processadores incorporados, que normalmente não são x86.
  • Isso ‘ simplesmente não é verdade. SSE2 pode manipular 4 flutuadores ou 2 flutuadores em uma operação, AVX pode manipular 8 flutuadores ou 4 duplos, AVX-512 pode manipular 16 flutuadores ou 8 duplos. Para qualquer tipo de computação de alto desempenho, matemática em flutuações deve ser considerada como duas vezes a velocidade das mesmas operações em duplas em x86.
  • E ‘ s ainda pior do que isso, já que você pode colocar o dobro de floats no cache do processador do que faria com duplos, e a latência de memória provavelmente será o principal gargalo em muitos programas. Manter um conjunto completo de flutuadores aquecidos no cache pode ser literalmente uma ordem de magnitude mais rápido do que usar duplos e fazer com que eles se espalhem para a RAM.

Resposta

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ê está lidando com mais de dezenas de milhares de float números.

Muitas / muitas funções ou operadores matemáticos convertem / retornam double e você não ” não quero lançar 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 fluxo e precisar classifique-os, coloque os números em uma float[].

Resposta

Algumas plataformas (ARM Cortex-M2, Cortex-M4 etc) don “t support double (Pode sempre 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. double pode ser emulado .). É por isso que você pode precisar seguir int ou float .

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

Você pode verificar o famoso artigo de D. Goldberg (“O que todo cientista da computação deve saber sobre 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.

http://perso.ens-lyon.fr/jean-michel.muller/goldberg.pdf

Comentários

  • Esta pergunta já foi muito bem respondida há um ano …mas em qualquer caso, eu ‘ d diria que sempre que ‘ estiver usando o dobro em plataformas com aceleração FPU de precisão dupla, você deve usar em qualquer outro, mesmo que isso signifique deixar o compilador emulá-lo em vez de tirar vantagem de um FPU com ponto flutuante apenas (observe que FPU ‘ s não ‘ t necessário em todas as plataformas também, na verdade, uma arquitetura Cortex-M4 os define como um recurso opcional [M2 foi um erro de digitação?]).
  • A chave para essa lógica é, enquanto é ‘ s verdadeiro deve estar cansado de aritmética de ponto flutuante, e ‘ s muitos ” quirks “, definitivamente não tomando a presença de suporte de FPU para duplos para significar simplesmente usar duplos em vez de flutuantes. Os flutuadores são geralmente mais rápidos do que os duplos e ocupam menos memória (os recursos da FPU variam). O volume de uso impede que este ponto seja uma otimização prematura. Assim como o fato de que os duplos são claramente um exagero para muitos (talvez até mesmo a maioria) dos aplicativos. Os elementos nesta página realmente precisam ter suas posições relativas e tamanhos calculados para 13 casas decimais?
  • Ao incluir um link para uma página ou documento externo, copie o informações relevantes, ou resumo, do documento em sua resposta. Links externos tendem a desaparecer com o tempo.

Resposta

Para problemas do mundo real, o limite de amostragem de seus dados são importantes ao responder esta pergunta. Da mesma forma, o nível de ruído também é importante. Se um deles for excedido por sua seleção de tipo de dados, nenhum benefício virá do aumento da precisão.

A maioria dos amostradores do mundo real são limitados a DACs de 24 bits. Sugerir que 32 bits de precisão em cálculos do mundo real deve ser adequado onde o significando tem 24 bits de precisão.

A precisão dupla tem o custo de 2x a memória. Portanto, limitar o uso de duplos em vez de flutuadores pode reduzir drasticamente a pegada de memória / largura de banda dos aplicativos em execução.

Resposta

A escolha de qual variável usar entre float e double depende da precisão dos dados necessários. Se for necessário que uma resposta tenha uma diferença insignificante da resposta real, o número de casas decimais exigidas será muitas, portanto, ditará que o dobro está em uso. A flutuação cortará algumas partes das casas decimais, reduzindo assim a precisão. h3> Comentários

  • Esta resposta não ‘ não acrescenta nada de novo à pergunta e não diz nada de uso real.

Resposta

Normalmente, eu uso o tipo float quando Não preciso de muita precisão – por exemplo, para dinheiro – o que é errado, mas é o que costumo fazer erroneamente.

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

O padrão C99 diz o seguinte:

Existem três tipos de ponto flutuante: float, double e long double. O tipo double fornece pelo menos tanta precisão quanto float, e o tipo long double fornece pelo menos tanta precisão quanto double. O conjunto de valores do tipo float é um subconjunto do conjunto de valores do tipo double; o conjunto de valores do tipo double é um subconjunto do conjunto de valores do tipo long double.

Eu nunca usei realmente long double, mas eu não uso tanto C / C ++. Normalmente eu uso linguagens com tipos dinâmicos como Python, onde você não precisa se preocupar com os tipos.

Para obter mais informações sobre Double vs Float , consulte esta questão em SO .

Comentários

  • Usar ponto flutuante para cálculos sérios de dinheiro é provavelmente um erro.
  • float é exatamente o tipo errado de dinheiro. Você precisa usar a maior precisão possível.
  • @BartvanIngenSchenau Ponto flutuante para dinheiro geralmente funciona, ponto flutuante binário não. Por exemplo .net ‘ s Decimal é um tipo de ponto flutuante e ‘ é normalmente uma boa escolha para cálculos de dinheiro.
  • @ChrisF Você não ‘ não precisa de ” alta precisão ” por dinheiro, você precisa dos valores exatos.
  • @SeanMcSomething – Ponto justo. No entanto, os flutuadores ainda são do tipo errado e, dados os tipos de ponto flutuante disponíveis na maioria dos idiomas, você precisa de ” alta precisão ” para obter ” valores exatos “.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *