Єдиний недолік, про який я можу подумати, - це мати справу з великою кількістю, яка переповниться, коли буде поставлено квадрат.
Наприклад, на Java:
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!
Також варто зазначити, що це відбувається, коли ви використовуєте Math.pow () з точно такими ж номерами і повертаєте до int з подвійного повернутого з 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!
Це працює? Ні , він дав правильну відповідь лише тому y*y
, що затискається Integer.MAX_VALUE
, і x*x
менше, ніж Integer.MAX_VALUE
. Якщо вас x*x
також затискали, Integer.MAX_VALUE
ви отримаєте неправильну відповідь.
Подібні принципи також застосовуються для плавців та парних пар (за винятком того, що вони, очевидно, мають більший діапазон, перш ніж вони переповнюються) та будь-якої іншої мови, яка мовчки дозволяє переповнення.