长数据类型中k的正幂

时间:2015-09-08 19:10:53

标签: java

我必须在java long 数据类型中打印整数k的所有正幂。 我的代码是:

int k = Integer.parseInt(args[0]);
    int i = 1;
    long a = k;
    while (a <= Long.MAX_VALUE) {
        System.out.print(i + " ");
        System.out.println(a);
        i++;
        a = (long) Math.pow(k, i);
      }

运行此程序时会创建一个无限循环。

但是,当我用一个小小的改动来运行这个程序时:(我刚刚在 条件下删除了等于运算符)

int k = Integer.parseInt(args[0]);
    int i = 1;
    long a = k;
    while (a < Long.MAX_VALUE) {
        System.out.print(i + " ");
        System.out.println(a);
        i++;
        a = (long) Math.pow(k, i);
       }

就我认为经过那么小的改变后,它的工作正常。 但是,我无法理解这里发生的事情。

3 个答案:

答案 0 :(得分:4)

问题是在double电话之后从long转变为Math.pow()double可以包含比long更大的数字,如果您尝试将大double投射到long,您将获得Long.MAX_VALUE。您的第一个循环将永远不会退出,因为某个点之后的所有指数都将返回Long.MAX_VALUE

亲眼看看:

public class DoubleToLong {
    public static void main(String[] args) {
        System.out.println((long)Double.MAX_VALUE);
        System.out.println(Long.MAX_VALUE);
    }
}

返回:

9223372036854775807
9223372036854775807

答案 1 :(得分:1)

长数据类型是64位二进制补码整数。如果在两种情况下都检查结果,您会发现在经过一定次数的迭代后它达到了最大值,后续迭代会将计算结果限制为只有long的最大值。因此&lt; = condition永远不会是假的,因为它将保持等于long max。 当你删除等于条件时,它会在最接近的值达到最大值时断开。

尝试用K作为2,一定数量的迭代是63.(只要64位)

答案 2 :(得分:0)

无声地溢出。相反,计算前面的迭代次数并循环该次数。