Aklıma gelen tek dezavantaj, kare olduğunda taşacak büyük sayılarla uğraşmaktır.
Örneğin, Java’da:
int x = Integer.MAX_VALUE / 1000000; //2147
int y = Integer.MAX_VALUE / 5000; //429496
System.out.println("x < y: " + (x < y)); //true
System.out.println("x*x: " + (x * x)); //4609609
System.out.println("y*y: " + (y * y)); //-216779712 - overflows!
System.out.println("x*x < y*y: " + (x * x < y * y)); //false - incorrect result due to overflow!
Ayrıca, Math.pow () yöntemini aynı numaralarla kullandığınızda ve int döndürdüğünüzde int tuşuna geri döndüğünüzde bunun ne olduğuna dikkat edilmesi gerekir Math.pow()
:
System.out.println("x^2: " + (int) (Math.pow(x, 2))); //4609609
System.out.println("y^2: " + (int) (Math.pow(y, 2))); //2147483647 - double to int conversion clamps to Integer.MAX_VALUE
System.out.println("x^2 < y^2: " + ((int) (Math.pow(x, 2)) < (int) (Math.pow(y, 2)))); //true - but for the wrong reason!
Çalışıyormu? Hayır , sadece doğru cevabı verdi çünkü y*y
kelepçeleniyor Integer.MAX_VALUE
ve x*x
ondan daha az Integer.MAX_VALUE
. Eğer x*x
ayrıca sabitlemeyi Integer.MAX_VALUE
o zaman yanlış bir cevap almak istiyorum.
Benzer prensipler aynı zamanda float'lar ve çiftler için de geçerlidir (taşmalarından önce açıkça daha geniş bir menzile sahip olmaları dışında) ve taşmalara sessizce izin veren diğer diller için de geçerlidir.