Java检查平方整数是否导致溢出

时间:2015-06-19 23:31:18

标签: java

如何确定平方整数是否导致溢出。所有大于46340的数字的平方值都大于java的最大整数值。由于java将包围数字平方46431给出-2147479015而平方2147483647给出1,因此进一步复杂化。还不幸的是,我不能在Java 8中执行此操作,因为它会抛出ArithmeticException。那么有没有其他可能的方法来检查整数是否导致整数导致溢出?

4 个答案:

答案 0 :(得分:5)

public class SecureSquare {

    private static final double SECURE_SQUARE_LIMIT = Math.sqrt(Integer.MAX_VALUE);

    public static int square(int number) {
        if (Math.abs(number) > SECURE_SQUARE_LIMIT) {
            throw new ArithmeticException("Square overflow exception!");
        }
        return number * number;
    }

    public static void main(String[] args) {
        int number = square(-46340);
        System.out.println(number);
    }
}

43640的输出:

2147395600

43641的输出:

Exception in thread "main" java.lang.ArithmeticException: Square overflow exception!
    at com.artofcode.test.SecureSquare.square(SecureSquare.java:9)
    at com.artofcode.test.SecureSquare.main(SecureSquare.java:15)
    ...

答案 1 :(得分:2)

public boolean isSquareCauseOverflow(int n) {
    if (n > 46340 || n < -46340) return true;
    else return false;
}

答案 2 :(得分:1)

不完全了解您的用例,但您可以对方法的输入设置限制,该输入返回平方值。此限制可以是Intert.MAX的sqrt。

否则 - 您可以使用类似BigInteger的内容来执行计算。

答案 3 :(得分:0)

  

同样不幸的是,我不能在Java 8中执行此操作,因为它会抛出ArithmeticException。

这是不正确的。整数溢出不会导致异常。只有整数除以零才会得到异常。这适用于所有现存版本的Java。

AFAIK,没有通用测试来查看原始整数算术运算 1 是否导致溢出。

对于任何特定情况,您可以根据数学分析或使用longBigInteger执行等效操作序列来设计测试。

例如:

 int number = ...
 int square = number * number;
 long longSquare = ((long) number) * ((long) number);
 if (square != longSquare) {
     System.out.println("Overflow occurred");
 }

(我认为:上面涉及Integer.MIN_VALUE可能存在边缘情况。如果您使用BigInteger,则不应存在任何边缘情况。)

在这种情况下,查看是否导致溢出的测试是微不足道的,并且不需要更复杂的替代方案。

1 - 在Java 8中,一些新的&#34;确切的&#34;整数算术方法被添加到Math类。如果发生溢出,这些抛出ArithmeticException。但是,原始算术运算符的行为没有改变。