Resultados inesperados ao trabalhar com inteiros muito grandes em idiomas interpretados

Eu estou tentando obter a soma de1 + 2 + ... + 1000000000, mas estou conseguindo resultados engraçados em PHP eNode.js.

PHP

$sum = 0;
for($i = 0; $i <= 1000000000 ; $i++) {
    $sum += $i;
}
printf("%s", number_format($sum, 0, "", ""));   // 500000000067108992

Node.js

var sum = 0;
for (i = 0; i <= 1000000000; i++) {
    sum += i ;
}
console.log(sum); // 500000000067109000

A resposta correta pode ser calculada usando

1 + 2 + ... + n = n(n+1)/2

Resposta correta500000000500000000Então decidi tentar outro idioma.

VAI

var sum , i int64
for i = 0 ; i <= 1000000000; i++ {
    sum += i
}
fmt.Println(sum) // 500000000500000000

Mas tudo bem! Então, o que há de errado com o meu código PHP e Node.js?

Talvez este seja um problema de linguagens interpretadas, e é por isso que funciona em uma linguagem compilada como o Go? Em caso afirmativo, outras linguagens interpretadas, como Python e Perl, teriam o mesmo problema?

questionAnswers(30)

yourAnswerToTheQuestion