Matemática de ponto flutuante em diferentes linguagens de programação
Eu sei que a matemática de ponto flutuante pode ser feia na melhor das hipóteses, mas estou me perguntando se alguém pode explicar a seguinte peculiaridade. Na maioria das linguagens de programação eu testei a adição de 0,4 a 0,2 deu um pequeno erro, enquanto que 0,4 + 0,1 + 0,1 deu não.
Qual é o motivo da desigualdade de ambos os cálculos e quais medidas podem ser adotadas nas respectivas linguagens de programação para obter resultados corretos.
Em python2 / 3
.4 + .2
0.6000000000000001
.4 + .1 + .1
0.6
O mesmo acontece em Julia 0.3
julia> .4 + .2
0.6000000000000001
julia> .4 + .1 + .1
0.6
e Scala:
scala> 0.4 + 0.2
res0: Double = 0.6000000000000001
scala> 0.4 + 0.1 + 0.1
res1: Double = 0.6
e Haskell:
Prelude> 0.4 + 0.2
0.6000000000000001
Prelude> 0.4 + 0.1 + 0.1
0.6
mas o R v3 acerta:
> .4 + .2
[1] 0.6
> .4 + .1 + .1
[1] 0.6