SORU
4 AĞUSTOS 2013, Pazar


Çok büyük tamsayı ile çalışırken yorumlanan diller üzerinde beklenmeyen sonuçlar

1 2 ... 1000000000 ama PHP eğlenceli sonuçlar elde ediyorum Node.js toplamını almaya çalışıyorum.

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

Doğru cevap kullanılarak hesaplanabilir

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

Doğru cevap =500000000500000000başka bir dil denemeye karar verdi.,

GİT

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

Ama gayet iyi çalışıyor! Benim PHP ve node.js kod ile yanlış nedir?

Belki de bu yorumlanan diller bir sorun, ve o Gitmek gibi derlenen bir dil bu yüzden işe yarıyor? Eğer öyleyse, Python ve Perl gibi diğer diller yorumlanan aynı sorun var?

CEVAP
4 AĞUSTOS 2013, Pazar


Python çalışır:

>>> sum(x for x in xrange(1000000000   1))
500000000500000000

Ya da:

>>> sum(xrange(1000000000 1))
500000000500000000

Python int otomatik keyfi hassas destekleyen bir Python long için teşvik eder. 32 veya 64 bit platformlarda doğru cevap üretecek.

Bu bir güç platformunun bit genişliği çok daha büyük 2 yükselterek görülebilir:

>>> 2**99
633825300114114700748351602688L

PHP alıyorsanız hatalı değerler PHP değerleri 2**32-1 daha büyük bir şamandıra için teşvik edilir olduğunu göstermek (Python ile):

>>> int(sum(float(x) for x in xrange(1000000000 1)))
500000000067108992

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Anthony

    Eric Anthony

    13 AĞUSTOS 2011
  • Jonathan Leack

    Jonathan Lea

    26 ŞUBAT 2007
  • pissengehen

    pissengehen

    26 EYLÜL 2006