Quanto é 0.1 + 0.2 ?

Antes de mais nada, acho que qualquer um irá concordar que 0.1 + 0.2 = 0.3. Respondemos a essa pergunta trivialmente, sem pensar duas vezes. Bom, o R também responde a essa pergunta sem a menor das dúvidas.

> 0.1 + 0.2
[1] .3

Sendo assim, se fizermos o teste lógico para ver se 0.1 + 0.2 é igual a 0.3, também já sabemos que será verdadeiro.

> (0.1 + 0.2) == .3
[1] FALSE

Surpreendentemente, o teste dá falso. Isso significa então que o R possui um erro de operação tosco ao ponto de invalidar todos os resultados que eu puder gerar algum dia? Certamente não.

O que acontece aqui é que ao converter o número 0.1 para a base binária a representação deste número passa a ser uma dízima periódica (para ser mais exato 0.0001100110011001100110011001100110011001100110011...) então em algum ponto tem que acontecer um arredondamento. Na verdade outras linguagens são mais sinceras com este resultado. Vejamos o caso de Python, Julia e o próprio R, alterando o número de casas decimais.

In [1]: .1 + .2
Out[1]: 0.30000000000000004

julia> .1 + .2
0.30000000000000004

> print(.1 + .2, digits=20)
[1] 0.30000000000000004441

Comparado a outras linguagens, a diferença aqui fica por conta de que no R o resultado não é explicitamente exibido. Mas é claro que, apesar de não ser igual, a precisão é suficientemente boa.

Um comentário:

  1. Acho que julia que é a exceção... todas as linguagens que vi até hoje "escondem" esse erro. No Python e no C/C++/Java você precisa forçar ele a exibir mais casas de precisão pra detectar esse erro;

    ResponderExcluir