Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
大输入的java.lang.StackOverflowerr异常_Java_String_Recursion_Stack_Overflow - Fatal编程技术网

大输入的java.lang.StackOverflowerr异常

大输入的java.lang.StackOverflowerr异常,java,string,recursion,stack,overflow,Java,String,Recursion,Stack,Overflow,基本上,我正在编写一个程序来手动进行一个简单的除法,我希望小数点最多能达到10^6位。该程序适用于输入使用递归进行此类计算是一个好主意,但您进行的每个子调用都会在堆栈中存储指针和其他信息,最终填充堆栈。我不知道虚拟机的深度,但我认为JVM的最大堆或堆栈大小取决于可以保留多少连续的可用内存,因此您的问题可以通过使用改变堆栈大小的-Xssparameter来解决(例如java-Xss8M YourClass)。如果这仍然不起作用或者您无法获得足够的内存,我会尝试使用64位JVM 如果所有这些都不起作

基本上,我正在编写一个程序来手动进行一个简单的除法,我希望小数点最多能达到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());
    }
}