「ローレンツ アトラクタ」と呼ばれるフラクタルを Java でレンダリングしようとしています。double
機能しない (範囲外の値) ため、BigDecimals を選択することにしました。38 回繰り返した後、コードがクラッシュし、ArithmeticException (Underflow) が発生します。コードの一部を次に示します。
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("----------");
これは私が得る出力です。それに対して何かできることはありますか?コードが見栄えがよくない場合は申し訳ありません。また、それをどのように行うべきかについての疑似コードを提供することもできます。必要な場合は教えてください。
編集:これは分割された2番目の行です:
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