你们好,比我更好的程序员。没什么大不了的,但我对这个函数很好奇,更重要的是它有时给出的结果。因此,我为作业定义了一个包含负指数的递归幂函数。对于正值和 0,它工作得很好,但是当我输入一些负值时,答案真的很奇怪。这是函数:
public static double Power(int base, int exp){
if (exp == 0)
return 1.0;
else if(exp >=1)
return base * Power(base, exp - 1);
else
return (1.0/base) * Power(base, exp + 1);
}
因此,对于调用 Power(5, -1),该函数返回 0.2,就像它应该的那样。但对于 Power(5, -2) 来说,函数返回 0.04000000000000001 而不仅仅是 0.04。 再说一次,这不是什么大问题,因为它是为了家庭作业而不是“现实生活”,但只是好奇为什么会发生这种情况。我认为这与计算机内存或 double 值的存储方式有关,但确实不知道。谢谢大家!
PS,如果有什么不同的话,这是使用 Netbeans 用 Java 编写的。
最佳答案
通过仔细组织算术可以减少浮点舍入误差。一般来说,您希望最大限度地减少舍入运算的次数以及对舍入结果执行的计算次数。
我对你的函数做了一个小改动:
public static double Power(int base, int exp) {
if (exp == 0)
return 1.0;
else if (exp >= 1)
return base * Power(base, exp - 1);
else
return (1.0 / Power(base, -exp));
}
对于您的测试用例,Power(5, -2)
,这仅执行一次舍入计算,即递归顶部的除法。它得到最接近 1/25.0 的 double 值,打印为 0.04。
关于java - 递归幂函数给出了奇怪的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43420885/