java - 递归幂函数给出了奇怪的答案

标签 java recursion memory double exponential

你们好,比我更好的程序员。没什么大不了的,但我对这个函数很好奇,更重要的是它有时给出的结果。因此,我为作业定义了一个包含负指数的递归幂函数。对于正值和 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 用 Ja​​va 编写的。

最佳答案

通过仔细组织算术可以减少浮点舍入误差。一般来说,您希望最大限度地减少舍入运算的次数以及对舍入结果执行的计算次数。

我对你的函数做了一个小改动:

  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/

相关文章:

java - GZIP Streams 的序列化/反序列化不一致

Javascript 递归函数不返回值?

c - shmat() 返回的虚拟内存地址指向不同的硬件内存位置

memory - 为什么将 OpenCL 内核排队执行会导致程序的内存使用增加?

java - 如何生成类似 apache 的唯一 id?

java - 如何在保留形状的同时优化图形的渲染?

java - 递归快速供电方法

c++ - 为什么这个 C++ 递归模板不起作用?

android - Android应用程序上的高级用户可以读取内存存储的变量吗

java - 如何禁用 JSpinner 的键盘和鼠标输入?