Os Limites da dupla variável em C ++

variáveis ​​de ponto flutuante em C ++ vêm com suas próprias limitações. Eles não podem ser usados ​​para contar as coisas, eles levam mais tempo para processar, eles consomem mais memória, e eles também sofrem de erro de arredondamento (embora não tão ruim quanto int

). Agora a considerar cada um destes problemas, por sua vez.

Contando com o dobro

Você não pode usar uma variável de ponto flutuante em um aplicativo onde a contagem é importante. Em C ++, você não pode dizer que há 7,0 personagens de meu primeiro nome. Os operadores envolvidos na contagem não funcionam em variáveis ​​de ponto flutuante. Em particular, a auto-incremento (++) e auto-redução (- -) operadores são estritamente verboten sobre duplo.

velocidade de cálculo da dupla

Os computadores podem realizar operações aritméticas inteiro mais rápido do que eles podem fazer aritmética de ponto flutuante. Felizmente, os processadores de ponto flutuante ter sido construído em CPUs por muitos anos agora, para a diferença de desempenho não é tão significativa como era antes. O ciclo seguinte foi escrito apenas como um exemplo simples, primeiro usando aritmética inteira:

int nValue1 = 1, nValue2 = 2, nValue3 = 2-for (int i = 0- i lt; 1000000000- i ++) {int nAverage = (nValue1 + nValue2 + nValue3) / 3-}

Este ciclo demorou cerca de 5 segundos para executar. Execute o mesmo loop em ponto flutuante aritmética:

dupla dValue1 = 1, dValue2 = 2, dValue3 = 2-for (int i = 0- i lt; 1000000000- i ++) {double DAVERAGE = (dValue1 + dValue2 + dValue3) / 3.0-}

Este olhar levou cerca de 21 segundos para executar. Calculando uma média de 1 bilhão de vezes em pouco mais de 20 segundos não é gasto, mas ainda é quatro vezes mais lento que o tempo de processamento para o seu valor inteiro equivalente.

A variável dupla consome mais memória

Em um PC ou Macintosh, um int consome 4 bytes, enquanto que um duplo ocupa 8 bytes. Isso não soa como muito - e, de fato, não é - mas se você tivesse alguns milhões dessas coisas para manter na memória. . . Bem, ainda não seria muito. Mas se você tivesse um pouco cem milhões, então a diferença seria considerável.

Esta é outra maneira de dizer que, a menos que você precisa para armazenar um pedaço de um monte de objetos, não se preocupe com a diferença de memória ocupada por um tipo em relação a outro. Em vez disso, escolher o tipo de variável que atenda às suas necessidades.

Se você só acontecerá a estar programando um aplicativo que precisa (por exemplo) para manipular a idade de cada ser humano no planeta, ao mesmo tempo, então você pode querer inclinar-se para o menor int porque consome menos memória. (Você faz esse tipo de coisa muitas vezes?)

Perda de precisão com o dobro

Uma variável de casal tem cerca de 16 dígitos significativos de precisão. Considere que um matemático poderia expressar o número 1/3 0,333. . ., Onde as elipses indicam que os trios ir para sempre. O conceito de uma série infinita faz sentido em matemática, mas não em computação.

Um computador apenas tem uma quantidade limitada de memória e uma quantidade finita de precisão. Por isso, tem que terminar, o que resulta em uma pequena (mas real) erro.

C ++ pode corrigir erro de arredondamento em uma série de casos. Por exemplo, na saída, se uma variável é ,99999999999999, C ++ vai simplesmente assumir que ele é realmente 1.0 e exibi-lo em conformidade. No entanto, C ++ não podem corrigir todos os erros de arredondamento de ponto flutuante, por isso você precisa ter cuidado. Por exemplo, você não pode ter certeza que 1/3 + 1/3 + 1/3 é igual a 1,0:

dupla d1 = 23.0-double d2 = d1 / 7.0-se (d1 == (d2 * 7.0)) {cout lt; lt; "Chegamos aqui?" lt; lt; endl-}

Você pode pensar que este trecho de código seria sempre exibir o "Chegamos aqui?" corda, mas surpreendentemente não. O problema é que 23 dividido por 7 não podem ser expressos exatamente em um número de ponto flutuante. Algo está perdido. Assim D2 * 7 é muito próximo de 23, mas não é exactamente igual.

Ao invés de olhar para a igualdade exacta entre dois números de ponto flutuante, você deve estar se perguntando: # 147 É d2 * 7 vanishingly perto de D1, valor # 148- Você pode fazer isso da seguinte forma?:

dupla d2 d1 = 23.0-double = d1 / 7.0 - // É d2 * 7.0 dentro delta do d1 dupla diferença = (d2 * 7.0) -? d1-double delta = 0,00001-se (diferença lt; delta diferença> -delta) {cout lt; lt; "Chegamos aqui?" lt; lt; endl-}

Este trecho de código calcula a diferença entre d1 e d2 * 7.0. Se a diferença for inferior a um pequeno delta, o código chama-lo um dia e diz que d1 e D2 * 7 são essencialmente iguais.

faixa não tão limitada da dupla

O maior número que uma loja dupla lata é de aproximadamente 10 elevado à potência 38. Isso é um 1 com 38 zeros depois ele- que come a 2 bilhões tamanho máximo insignificante para um int para o pequeno almoço. Isso é ainda mais do que a dívida nacional (pelo menos, no momento da redação deste texto). Há provavelmente aplicações onde 38 zeros não são suficientes.

Lembre-se que apenas os primeiros 16 dígitos são significativos. Os restantes 22 dígitos são ruído, tendo já sucumbiu ao erro de arredondamento de ponto flutuante padrão.

menu