Diferença entre float e double - qual devo usar?

(Nota: este artigo pressupõe que os leitores conheçam os conceitos básicos de ciência da computação)

Muitos programadores / estudantes novatos que estão matriculados em Ciência da Computação fazem as perguntas frequentes que são relevantes para o campo específico da Ciência da Computação que eles estudam. A maioria dos cursos para iniciantes começa com os tópicos do sistema numérico usado nos computadores modernos, incluindo o binário, decimal, octal e hexadecimal sistema. Esses são os formatos de número de computador que são as representações internas dos valores numéricos em computadores (ou calculadoras e qualquer outro tipo de computador digital). Esses valores são armazenados como "agrupamento de bits".

Como sabemos, os computadores representam dados em conjuntos de dígitos binários (ou seja, na combinação de 1s e 0s, tal como, 1111 representa 15 no sistema decimal), faz sentido ensinar sobre os diferentes formatos de números usados ​​para representar um intervalo dinâmico de valores, porque eles formam os blocos básicos do cálculo / processamento de números em qualquer tipo de operação. Depois que o sistema numérico é definido na sala de aula (geralmente mal), os alunos são tentados a mudar para os diferentes formatos de números dentro do mesmo tipo (ou seja,., aritmética de ponto flutuante) com certa precisão e intervalo de números. Assim, eles são forçados a aprender as nuances entre certos tipos. Dois dos tipos de dados mais usados ​​são Flutuador e Duplo, e enquanto eles segmentam as mesmas necessidades (ou seja,., aritmética de ponto flutuante), existem algumas diferenças em sua representação interna e efeito geral no cálculo no programa. É lamentável que muitos programadores percam as nuances entre os tipos de dados Flat e Double e acabem fazendo mau uso deles em locais onde não deveriam ser usados. Em última análise, resultando em erros de cálculo em outras partes do programa.

Neste artigo, mostrarei a diferença entre float e double com os exemplos de código na linguagem de programação C. Vamos começar!

Float vs Double… Qual é o problema?

Flutuante e Duplo são as representações de dados usadas para operações aritméticas de ponto flutuante; pense nos números decimais que você calcula na classe matemática, como, 20.123, 16,23, 10,2, etc., eles não são números inteiros (ou seja,., 2, 5, 15, etc.), portanto, requerem a consideração de frações no binário. Como os números decimais resultantes (ou seja,., 20.123, 16,23, etc.) não podem ser facilmente representados com um formato binário normal (ou seja, Inteiro). A principal diferença entre Float e Double é que o primeiro é o dado de ponto flutuante de precisão única (32 bits), enquanto o último é o tipo de dado de ponto flutuante de precisão dupla (64 bits). Double é chamado de "double" porque é basicamente uma versão de precisão dupla do Float. Se você estiver calculando uma quantidade enorme (pense nos milhares de zeros no número), as imprecisões serão menores no Double e você não perderá muita precisão.

É melhor elaborar usando os exemplos de código. A seguir está a operação no Float e Double através das funções matemáticas fornecidas na linguagem C:

#incluir

int main ()

float num1 = 1.f / 82;

float num2 = 0;

para (int i = 0; i < 738; ++i)

num2 + = num1;

printf ("%. 7g \ n", num2);

num3 duplo = 1,0 / 82;

num4 duplo = 0;

para (int i = 0; i < 738; ++i)

num4 + = num3;

printf ("%. 15g \ n", num4);

getchar ();

Imprime o seguinte:

9.000031

8.99999999999983

Aqui, você pode ver que a pequena diferença na precisão de Float e Double fornece uma resposta completamente diferente, embora Double pareça ser mais preciso que Float.

A seguir, é apresentado o exemplo da função sqrt () em C:

#incluir

#incluir

int main ()

float num1 = sqrt (2382719676512365.1230112312312312);

double num2 = sqrt (2382719676512365.1230112312312312);

printf ("% f \ n", num1);

printf ("% f \ n", num2);

getchar ();

Ele fornece a seguinte saída:

48813108.000000

48813109.678778

Aqui, você pode ver que a resposta em Double tem uma precisão melhor.

No geral, é melhor usar o Double para aritmética de ponto flutuante, pois várias funções matemáticas padrão em C operam em computadores duplos e modernos são extremamente rápidos e eficientes para cálculos de ponto flutuante duplo. Isso reduz a necessidade de usar o Float, a menos que você precise operar muitos números de ponto flutuante (pense em matrizes grandes com milhares de zeros nos números) ou esteja operando em um sistema que não oferece suporte a ponto flutuante de precisão, como muitas GPUs, dispositivos de baixa potência e determinadas plataformas (ARM Cortex-M2, Cortex-M4 etc.) ainda não suportam o Double, então você deve usar o Float. Além disso, lembre-se de que determinadas GPUs / CPUs funcionam melhor / eficientemente no processamento Float, como no cálculo de vetores / matriz, portanto, talvez você precise procurar no manual / documentação de especificação de hardware para decidir melhor qual deles deve ser usado. para uma máquina em particular.

Raramente existe um motivo para usar o Float em vez de Double no código destinado aos computadores modernos. A precisão extra no Double reduz, mas não elimina, a chance de erros de arredondamento ou outra imprecisão que pode causar problemas em outras partes do programa. Muitas funções ou operadores matemáticos convertem e retornam Double, para que você não precise converter os números de volta ao Float, pois isso pode perder a precisão. Para uma análise detalhada da aritmética de ponto flutuante, recomendo que você leia este artigo impressionante (http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html).

Sumário

Então ... em poucas palavras:

Locais onde você deve usar o Float:

  • Se você estiver segmentando hardware em que a precisão única é mais rápida que a precisão dupla.
  • Seu aplicativo faz uso pesado da aritmética de ponto flutuante, como milhares de números com milhares de zeros.
  • Você está fazendo uma otimização de nível muito baixo. Por exemplo, você está usando instruções especiais da CPU (ou seja, SSE, SSE2, AVX etc.) que operam em vários números / matrizes / vetores por vez.

Conclusão

Neste artigo, destaquei a diferença entre Float e Double, e qual deve ser usada em locais específicos. Indiscutivelmente, é melhor usar o Double na maioria dos lugares às cegas, especialmente se você estiver direcionando computadores modernos, pois as chances de baixa eficiência devido ao uso da aritmética de ponto flutuante duplo são altamente improváveis. Se você tiver alguma dúvida, pode perguntar na seção de comentários abaixo!