Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.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 大十进制底流_Java_Bigdecimal_Arithmeticexception - Fatal编程技术网

Java 大十进制底流

Java 大十进制底流,java,bigdecimal,arithmeticexception,Java,Bigdecimal,Arithmeticexception,我试图用Java渲染一个称为“Lorenz吸引子”的分形。由于double不起作用(值超出范围),我决定选择大小数。在38次迭代之后,我的代码崩溃了,它给我带来了一个算术异常(下溢)。以下是一些代码: BigDecimal xnew = this.x.add(this.hBig.multiply(BigDecimal.TEN).multiply(this.x.add(this.y.negate()))); //This is the line that crashes BigDecimal y

我试图用Java渲染一个称为“Lorenz吸引子”的分形。由于
double
不起作用(值超出范围),我决定选择大小数。在38次迭代之后,我的代码崩溃了,它给我带来了一个算术异常(下溢)。以下是一些代码:

BigDecimal xnew = this.x.add(this.hBig.multiply(BigDecimal.TEN).multiply(this.x.add(this.y.negate())));

//This is the line that crashes
BigDecimal ynew = this.y.add(this.hBig.multiply(this.x.negate().multiply(this.z)).add(ZWENTYEIGHT.multiply(this.x.add(this.y.negate()))));

BigDecimal znew = this.z.add(this.hBig.multiply(this.x.multiply(this.y).add(FRAC.multiply(this.z).negate())));

this.x = xnew;
this.y = ynew;
this.z = znew;
System.out.println("X="+this.x);
System.out.println("Y="+this.y);
System.out.println("Z="+this.z);
System.out.println("----------");
。 我能做点什么反对吗?如果代码看起来不太好,很抱歉。我还可以提供一些伪代码来说明应该如何做,如果需要,请告诉我

编辑:这是第二行拆分:

BigDecimal temp = ZWENTYEIGHT.multiply(this.x.add(this.y.negate()));
BigDecimal temp2 = this.x.negate().multiply(this.z);
BigDecimal temp3 = this.hBig.multiply(temp2); //This crashes.
BigDecimal temp4 = temp3.add(temp);
BigDecimal ynew = this.y.add(temp4);
EDIT2:这是一些伪代码:

do 4000 times
    xnew=x+h*10*(x-y)
    ynew=y+h*((-x*z)+28*x-y)
    znew=z+h*(x*y-8/3*z)
    x=xnew
    y=ynew
    z=znew

虽然
BigDecimal
double
更强大、更灵活,但它仍然有局限性;即:

BigDecimal由一个任意精度的整数无标度值和一个32位整数标度组成

这意味着您不能表示大于或小于2^31的数字。这是一个巨大(或微小)的数字(10^2^31是最大的可能乘数),对于几乎任何可能的用例来说,这都是一个不切实际的边缘情况。相比之下,宇宙中“只有”大约4×10^80个原子

那么,如果您遇到溢出或下溢错误,这意味着什么呢?您正在处理的数字的规模太大或太小,以至于
BigDecimal
无法支持它们。这几乎肯定意味着你犯了某种逻辑错误,并且没有做你想要做的操作——再次检查你的数学


有时,问题在于操作顺序——例如,您的结果可能是一个大小合理的数字,但中间步骤不可行。计算时间就是一个例子。在这种情况下,您需要尝试其他操作顺序,以避免出现不合理的数字。

这一行做了大量工作。它可能会在很多地方崩溃。试着把这条线分成小块。好的,完成了。虽然我不认为这真的会有帮助,但下溢还是发生了。现在它在线路的哪一部分崩溃了?因为你的数字很快接近0,我建议检查你的算法。我做了一个快速搜索,你的p代码似乎与这里的代码相似(包括常量值),但与这里的代码不同:对于其他可能阅读本文的人,我将网站上的代码粘贴到这里:谢谢你的详细回答。我的问题一年多前就解决了。也许对其他人有帮助。