我目前正在研究一种使用递归进行取幂计算的方法。以下是我到目前为止的情况:
public static long exponentiation(long x, int n) {
if (n == 0) {
return 1;
} else if (n == 1) {
return x;
// i know this doesn't work since im returning long
} else if (n < 0) {
return (1 / exponentiation(x, -n));
} else {
//do if exponent is even
if (n % 2 == 0) {
return (exponentiation(x * x, n / 2));
} else {
// do if exponent is odd
return x * exponentiation(x, n - 1);
}
}
}
我有两个问题。第一个问题是我不能做负面指数,这不是一个主要问题,因为我不需要做负指数。第二个问题,是某些计算给我错误的答案。例如2 ^ 63给出了正确的值,但它给了我一个负数。并且2 ^ 64并且只是给我0.是否有我解决这个问题?我知道我可以将long
&#39}切换到double
,我的方法将完美无缺。但是,我的教授要求我们使用long
。谢谢你的帮助!
答案 0 :(得分:2)
long可以表示的最大值是2 ^ 63 -1。因此,如果你计算2 ^ 63,那么它就比那个长期可以容纳和包裹的更大。使用{{3}}表示长。
只需改变长到两倍并不完全有效。它改变了方法的语义。浮点数具有有限的精度。使用64位浮点数,您仍然可以仅表示与64位整数相同的数字量。它们的分布不同。 long可以代表每个整数 - 2 ^ 63和2 ^ 63-1。双精度数也可以表示数字的分数,但是在高数字时,它甚至不能代表每个数字。
例如,您可以在100000000000000000000000000000000000000000000000000之后表示的下一个双倍是100000000000000030000000000000000000000000000000000 - 这样您就可以使用高达30000000000000000000000000000000000的万亿,而不能用双倍代表。
您正在尝试修复一些您不应该为修复而烦恼的事情。使用long,您的方法可能返回固定的最大返回值。你的方法应该清楚地说明如果它溢出会发生什么,你可能想要处理这样的溢出(例如使用Math#multiplyExactly
),但如果long是你应该返回的返回值,那么你应该使用的是