Bunun cevabı "şaşırtıcı bir şekilde" basit:
İlk - çoğunuz bildiğiniz gibi - dan aralıkları tamsayı 32 bit -2,147,483,648 için 2,147,483,647 . Peki, PHP bir sonuç alırsa, bundan daha LARGER olur?
Genellikle, 2.147.483.647 + 1'in −2.147.483.648'e dönüşmesine neden olan hemen bir "Taşma" beklenir . Ancak, durum böyle değil. PHP daha büyük bir sayıyla karşılaşırsa, INT yerine FLOAT döndürür.
PHP, tamsayı türünün sınırlarının ötesinde bir sayıyla karşılaşırsa, bunun yerine kayan sayı olarak yorumlanır. Ayrıca, tamsayı tipinin sınırlarının ötesinde bir sayı ile sonuçlanan bir işlem, bunun yerine bir kayan nokta döndürür.
http://php.net/manual/en/language.types.integer.php
Bununla birlikte, PHP FLOAT uygulamasının IEEE 754 çift kesinlikli Format'ı izlediğini bilmek, PHP'nin hassasiyeti kaybetmeden 52 bit'e kadar sayılarla başa çıkabileceği anlamına gelir. (32 bit Sistemde)
Böylece, Sum'ınızın 9,007,199,254,740,992'ye ( 2 ^ 53 ) çarptığı noktada , PHP Maths tarafından döndürülen Float değeri artık yeterince hassas olmayacaktır.
E:\PHP>php -r "$x=bindec(\"100000000000000000000000000000000000000000000000000000\"); echo number_format($x,0);"
9.007.199.254.740.992
E:\PHP>php -r "$x=bindec(\"100000000000000000000000000000000000000000000000000001\"); echo number_format($x,0);"
9.007.199.254.740.992
E:\PHP>php -r "$x=bindec(\"100000000000000000000000000000000000000000000000000010\"); echo number_format($x,0);"
9.007.199.254.740.994
Bu örnek PHP'nin kesinliğini yitirdiği Noktayı gösterir. İlk olarak, son anlamlı bit atılacak ve ilk 2 ifadenin eşit sayı ile sonuçlanmasına neden olacak - ki bunlar değil.
ŞİMDİ AÇIK'tan itibaren, varsayılan veri türleriyle çalışırken tüm matematik yanlış olacaktır.
• Python veya Perl gibi yorumlanmış diğer diller için de aynı sorun var mı?
Ben öyle düşünmüyorum. Bence bu, tür güvenliği olmayan bir dil sorunu. Yukarıda belirtildiği gibi bir Tamsayı Taşması sabit veri türlerini kullanan her dilde OLACAKTIR, tip güvenliği olmayan diller bunu diğer veri türleriyle yakalamaya çalışabilir. Bununla birlikte, "doğal" (Sistem tarafından verilen) Sınırlarına ulaştıklarında - her şeyi döndürebilirler, ancak doğru sonuç.
Ancak, her dilin böyle bir Senaryo için farklı konuları olabilir.