【问题标题】:Double number returns stackoverflow [duplicate]双数返回stackoverflow [重复]
【发布时间】:2014-12-14 05:39:36
【问题描述】:

double 可以代表的最高数字非常高,我想。 尽管以下代码引发了异常。这实际上是我的完整代码。

public class Summe {
public static void main(String[] args) {
    System.out.println(summe(20000));
  }

public static double summe(double s) {
    return s == 0 ? s : s + summe(s-1); 
  }
}

感谢到目前为止的回答。我的问题是:我怎样才能使我的代码工作?

【问题讨论】:

  • 双精度范围与此无关。你反复调用summe 20k 次溢出堆栈。另外...您的实际问题是什么?
  • 你认为summe 在返回之前被调用了多少次?
  • 不要对双精度进行相等检查。
  • 我认为 summe 被调用了大约 20000 次。堆栈的极限在哪里?

标签: java function double stack-overflow


【解决方案1】:

这里的问题不在于double 可以容纳的数字大小——问题在于堆栈的大小。在这里,您有 20K 嵌套调用 summe,这对于堆栈来说方式太多了,无法处理,因此它会溢出。如果 sint 而不是 double,您将遇到完全相同的问题。

【讨论】:

  • 而且他在浮点上使用精确比较这一事实对基本情况没有帮助。
  • @chrylis:基本情况绝对没问题。 20000 - 1(等)将在不损失任何精度的情况下计算。
  • @chrylis 好点,尽管在这种情况下它巧合地有效。
  • 请注意,在我的机器上,堆栈在 6279 次调用后崩溃。
  • 我的堆栈在 5300 处溢出。5299 仍然可以正常工作。这很奇怪
【解决方案2】:

您对summe 的递归调用次数过多。

你应该仔细阅读这个问题以获得完整的解释:What is a StackOverflowError?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 2018-05-07
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多