내가 생각할 수있는 유일한 단점은 큰 숫자를 처리 할 때 제곱 할 때 넘칠 것입니다.
예를 들어, 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 () 를 정확히 같은 숫자로 사용하고에서 반환 된 double에서 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
당신은 잘못된 답변을 얻을 것입니다.
비슷한 원리가 floats & doubles (오버플로 전에 분명히 더 큰 범위를 제외하고)와 오버플로를 자동으로 허용하는 다른 언어에도 적용됩니다.