Pergunta

anos atrás eu aprendi a maneira dura sobre problemas de precisão com flutuadores então eu parei de usá-los. No entanto, eu ainda correr em código usando carros alegóricos e me fazer encolher porque eu sei que alguns dos cálculos será impreciso.

Assim, quando é apropriado usar um float?

EDIT: Como informação, eu não acho que eu me deparei com um programa onde a precisão de um número não é importante. Mas eu estaria interessado em exemplos de audição.

Foi útil?

Solução

Resposta curta:. Você só tem que usar um flutuador quando você sabe exatamente o que você está fazendo e por

resposta

Long: flutua (em oposição a duplos ) não são realmente mais utilizado fora 3D APIs, tanto quanto eu sei. Flutua e duplas têm as mesmas características de desempenho em processadores modernos, duplos são um pouco maiores e isso é tudo. Em caso de dúvida, basta usar dupla.

Oh sim, e uso decimal para cálculos financeiros, é claro.

Outras dicas

Todos os cálculos de ponto flutuante são inaccurature em um caso geral, flutua apenas mais assim do que dobra. Se você quiser mais informações ter uma leitura de O que cada cientista computador deve saber sobre Floating-Point Arithmetic

Quanto ao momento de usar carros alegóricos - eles são freqüentemente usados ??quando a precisão é menos importante do que salvar memória. Por exemplo, simulações simples de partículas em jogos de vídeo.

Em primeiro lugar, nunca use flutuadores ou duplas se você quiser representar valores decimais exatamente - Utilize inteiros tipos (int, long etc) ou decimais (que é apenas um tipo inteiro com um fator de escala). Flutuadores e duplas são convertidos internamente para uma representação exponencial na base 2 e números representados exactamente em uma representação exponencial na base 10 não pode em geral ser representado exactamente. (Por exemplo, o número 10 é somente representada aproximadamente por flutuadores ou duplos).

Em segundo lugar, em termos de precisão, depende do que você precisa. Não estou de acordo com o seu sentimento de que nunca há cálculos onde a precisão não importa. Você normalmente tem uma necessidade específica que o seu resultado final é preciso dizer, 3 dígitos. Não faz sentido olhar para a maior precisão possível se a sua entrada única tem uma precisão limitada - diz que pesam alguns 5g de farinha e sua escala só tem uma precisão de 0,5 g. Dito isto, cálculo intermediário normalmente beneficiar de maior precisão, mas algo que é mais importante do que a alta precisão se muitas vezes a velocidade.

Em terceiro lugar, quando pré-formando uma série de cálculos, digamos dentro de um loop, você precisa saber o que está fazendo quando se trata de quaisquer cálculos inexatos - você vai incorrer round-off erros e alguns algoritmos podem não chegar a uma resposta a qualquer grau de precisão. Compreender estas questões em detalhe pode exigir um curso de análise numérica. Isso não depende se você escolher flutuadores ou duplos para os seus cálculos.

Para cálculos de ponto flutuante eu normalmente ir com duplos, uma vez que são mais gerais e mais rápido do que carros alegóricos. No entanto, os flutuadores são menores e se você precisa para armazenar uma grande quantidade deles são a escolha para evitar problema de desempenho devido a erros de cache.

Para meu conhecimento, processamento de ponto flutuante é suportado no hardware para duplas, mas não flutua, portanto, usando carros alegóricos incorre uma conversão para o dobro. No entanto, algumas rotinas iria parar mais cedo ao calcular um valor iteratively quando você passar uma bóia, uma vez que isso implica que você só quer cerca de 8 dígitos de precisão vs. cerca de 16 para duplas.

Há muitos casos que você gostaria de usar um float. O que eu não entendo no entanto, é o que você pode usar em seu lugar. Se você quer dizer usando double vez de float, então sim, na maioria dos casos, você quer fazer isso. No entanto, double também terá problemas de precisão. Você deve usar decimal sempre que a precisão é importante.

float e double são muito úteis em muitas aplicações. decimal é um tipo de dados caro e sua gama (a magnitude do maior número pode representar) é inferior a double. Computadores geralmente têm apoio especial nível de hardware para esses tipos de dados. Eles são usados ?? muito na computação científica. Basicamente, eles são primários tipos de dados fracionários que deseja usar. No entanto, nos cálculos monetários, onde a precisão é extremamente importante, decimal é o caminho a percorrer.

A razão mais comum que eu poderia pensar é para economizar espaço. Não que esta é muitas vezes vale a pena se preocupar, mas em alguns casos isso é importante. Um flutuador ocupa metade tanta memória como uma dupla, assim você pode obter o dobro no mesmo espaço. Por exemplo, eu tive uma série de números que era grande demais para caber na memória RAM como duplos, mas fit como um flutuadores matriz.

Há de fato uma coisa onde ainda é comum a utilização flutua aka "Precisão simples" com 32 bits:. Aplicações gráficas e impressão

A outra razão são placas gráficas com as suas GPUs. Quanto menor for o tipo de dados, mais rápido a operação porque menos bits devem ser transportados. tipos de dados inteiros têm problemas com High Dynamic Range Imagens: O olho é capaz de funcionar em uma faixa de luminosidade 1: 10 ^ 13 e discerne ca. 4000 níveis. Assim, enquanto tipos de dados inteiro pode armazenar o número de níveis que são incapazes de armazenar o brilho de fundo enquanto flutua não tenho problemas com isso. Na verdade IEEE 754R permite que uma nova flutuar "metade de precisão" com 16 bits e uma de 10 bits mantissa que perde alguma precisão, mas permitiria uma velocidade ainda maior. OpenGL e DirectX e.g. utilização flutua amplamente. O olho é muito indulgente com artefatos, não há problema nenhum.

Todos os outros meios de comunicação constroem em gráficos estão herdando flutua como medida conveniente. A mantissa tem 24 bits, permitindo, por conseguinte, 2 ^ 24 = 16,7 milhões de passos consecutivos. Se você tiver uma impressora com resolução de 2000 dpi, você ainda é capaz de imprimir 213x213 m folhas. Mais de precisão suficiente.

Use flutuador para desempenho e tamanho . Se você pode gerenciar a perda de precisão.

Embora seja verdade que um processador moderno leva a mesma quantidade de tempo para processar opertions precisão simples e dupla, às vezes você pode obter duas vezes a taxa de transferência se você usar carros alegóricos com SIMD (MMX / SSE / etc. em x86) instruções.

registros

SSE são 128 bits de largura, e pode conter 4 carros alegóricos ou 2 duplos . Assim, se usado corretamente, você pode fazer o dobro das operações com carros alegóricos em comparação com duplos.

A redução de tamanho (4 bytes em vez de 8) torna-se importante quando se lida com muito grandes conjuntos de dados (e a redução de tamanho geralmente melhora o desempenho, bem como devido ao armazenamento em cache, etc.)

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