Единственный недостаток, о котором я могу думать, это когда приходится иметь дело с большими числами, которые будут переполнены в квадрате.
Например, в 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
то вы получите неправильный ответ.
Подобные принципы также применимы к плавающим и двойным значениям (за исключением того, что они, очевидно, имеют больший диапазон перед переполнением) и любому другому языку, который позволяет незаметно переполняться.