大输入的java.lang.StackOverflowerr异常
基本上,我正在编写一个程序来手动进行一个简单的除法,我希望小数点最多能达到10^6位。该程序适用于输入使用递归进行此类计算是一个好主意,但您进行的每个子调用都会在堆栈中存储指针和其他信息,最终填充堆栈。我不知道虚拟机的深度,但我认为JVM的最大堆或堆栈大小取决于可以保留多少连续的可用内存,因此您的问题可以通过使用改变堆栈大小的-Xssparameter来解决(例如java-Xss8M YourClass)。如果这仍然不起作用或者您无法获得足够的内存,我会尝试使用64位JVM 如果所有这些都不起作用,与通常的良好实践相反,我会尝试在没有递归的情况下执行此程序大输入的java.lang.StackOverflowerr异常,java,string,recursion,stack,overflow,Java,String,Recursion,Stack,Overflow,基本上,我正在编写一个程序来手动进行一个简单的除法,我希望小数点最多能达到10^6位。该程序适用于输入使用递归进行此类计算是一个好主意,但您进行的每个子调用都会在堆栈中存储指针和其他信息,最终填充堆栈。我不知道虚拟机的深度,但我认为JVM的最大堆或堆栈大小取决于可以保留多少连续的可用内存,因此您的问题可以通过使用改变堆栈大小的-Xssparameter来解决(例如java-Xss8M YourClass)。如果这仍然不起作用或者您无法获得足够的内存,我会尝试使用64位JVM 如果所有这些都不起作
我希望这有帮助 从compute()到compute的递归调用导致堆栈溢出。将您的方法更改为使用循环而不是递归,这样可以更好地扩展。请参阅wikipedia页面,了解您可以使用的不同除法算法: 或者像这样使用BigDecimal:
public class Main {
public static void main(String... args) {
final int precision = 20;
MathContext mc = new MathContext(precision, RoundingMode.HALF_UP);
BigDecimal bd = new BigDecimal("103993.0");
BigDecimal d = new BigDecimal("33102.0");
BigDecimal r = bd.divide(d, mc);
System.out.println(r.toString());
}
}
输出:3.1415926530119026041
设置精度以获得所需的小数位数。使用
java-Xss
设置java线程堆栈大小。我知道这不是你问题的答案,但你真的应该使用BigDecimal
来完成此任务。如果你想要10^6位小数,你可能应该放弃递归,以循环的方式进行计算。你对“方法”有什么不理解的地方。@StephenC:“方法”的意思是“过程”如何设置java线程大小?
此外,正如@Zutty在之前的评论中所说的,您肯定应该使用BigDecimal来完成此任务,imo。我以前尝试过实现BigDecimal,但精度高达20K所需的时间太长。
public class Main {
public static void main(String... args) {
final int precision = 20;
MathContext mc = new MathContext(precision, RoundingMode.HALF_UP);
BigDecimal bd = new BigDecimal("103993.0");
BigDecimal d = new BigDecimal("33102.0");
BigDecimal r = bd.divide(d, mc);
System.out.println(r.toString());
}
}