我必须在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);
}
就我认为经过那么小的改变后,它的工作正常。 但是,我无法理解这里发生的事情。
答案 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)
无声地溢出。相反,计算前面的迭代次数并循环该次数。