我正在尝试用 Java 渲染一个名为“Lorenz Attractor”的分形。因为double
不起作用(值超出范围),我决定选择 BigDecimals。经过 38 次迭代后,我的代码崩溃了,它给了我一个 ArithmeticException(下溢)。继承人的一些代码:
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