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*ykelepçeleniyor Integer.MAX_VALUEve x*xondan daha az Integer.MAX_VALUE. Eğer x*xayrıca sabitlemeyi Integer.MAX_VALUEo 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.