2011-07-24 6 views
0

私はこのコードを実行しようとしていますが、それはクラッシュし続け:それは最後の行を評価する際なぜこのコードはマシンをクラッシュさせますか?

log10(x):=log(x)/log(10); 
char(x):=floor(log10(x))+1; 
mantissa(x):=x/10**char(x); 
chop(x,d):=(10**char(x))*(floor(mantissa(x)*(10**d))/(10**d)); 
rnd(x,d):=chop(x+5*10**(char(x)-d-1),d); 
d:5; 
a:10; 
Ibwd:[[30,rnd(integrate((x**60)/(1+10*x^2),x,0,1),d)]]; 
for n from 30 thru 1 step -1 do Ibwd:append([[n-1,rnd(1/(2*n-1)-a*last(first(Ibwd)),d)]],Ibwd); 

Maximaがクラッシュします。なぜそれが起こるかもしれないどんなアイデア?

ありがとうございました。

+0

まあ、問題は丸め機能であるという結論に達しました。何が問題なの? – Anne

答えて

2

問題は、その差が負になり、丸め関数が負の引数でひどく死ぬということです。すべてが無残に失敗する前に印刷された最後の差が-316539/6125000ある

for n from 30 thru 1 step -1 do 
    block([], 
    print (1/(2*n-1)-a*last(first(Ibwd))), 
    print (a*last(first(Ibwd))), 
    Ibwd: append([[n-1,rnd(1/(2*n-1)-a*last(first(Ibwd)),d)]],Ibwd), 
    print (Ibwd)); 

:これを見つけるために、私はあなたにループを変更しました。だから今すぐお試しください

rnd(-1,3) 

と同じ問題を参照してください。これはすべて、あなたが負の数の対数をとっているという事実に由来しています。これは、Maximaが分析的継続によって複素数として解釈するものです。 Maximaは評価コードのどこかに、何かがひどく死んでしまうまで、これを評価しません。

具体的な例の「修正」はわかりませんが、あなたが何をしようとしているのか正確には分かっていないので、自分で見つけるには十分な情報があります。

1

浮動小数点数を分解したい場合は、最初に浮動小数点数を確認しましょう。 say z: 34.1

ビッグフロートのパーツには、lispを使用してアクセスできます。また、ビット数は?fpprecでアクセスできます。

したがって?second(z)*2^(?third(z)-?fpprec)はあなたを与える:

4799148352916685/140737488355328 

bfloat(%)は、あなたが得られます。

3.41b1. 

をあなたは整数としてのzの仮数をしたい場合は、?second(z) を見て今、私は確信して何もありませんよベース10で達成しようとしているのですが、Maxima はベース10の内部算術演算を行いません。
より多くのビット数が必要な場合は、 ?fpprecにリンクされているfpprec、 を設定することができます。 fpprecは "基数10の近似値"です。 したがって、fpprecは最初は16 ?fpprecに対応して56.

です。 FPPREC:100 は ?print(z)

、あなたはフロート表現の周りdiddlingしている場合、あなたは、たとえば、次のように入力して舌足らずのいずれかを見ることができます を知っているから恩恵を受ける可能性がある335

?fpprecに対応Lispのprint関数を使って内部フォームを出力します。

トレース機能を使用して、自分の機能やシステム機能をトレースすることもできます。

trace(append,rnd,integrate); 

あなたがマシンフロートを使用したい場合は、私は最後の行のために、あなたが使用することをお勧め、

をnに30 1スルーステップ-1 DOから:

あなたがこれを行うことを検討可能性が例えば
Ibwd:append([[n-1,rnd(1/(2.0*n- 1.0)-a*last(first(Ibwd)),d)]],Ibwd); 

小数点に注意してください。しかし、それでも十分ではありません。 は、atan(10)のような正確な構造体を挿入するためです。これらを丸めたり、ログ を計算しようとするのはおそらくあなたがしたいことではありません。私はMaximaが最初は別のことを考えていたとしても、ログには負であると判明したいくらかの乱雑な表現が与えられているので、Maximaは不幸だと思う。それは、適切な共通のlisp複素数オブジェクトを返すことを喜んで受け入れているlispログプログラムに番号を渡します。残念ながら、Maximaのほとんどは、LISP HAD COMPLEX NUMBERSより前に書かれていました。

このように、(log -0.5)= #C(-0.6931472 3.1415927)の結果は、他のMaximaにはまったく予期しないものです。 Maximaには複素数のための独自の形式があります。 3+4*%i

特に、Maximaディスプレイプログラムは、共通のlispの複素数形式よりも前のものであり、その処理方法がわかりません。

エラー(スタックオーバーフロー!!!)は、一般的なlisp複素数を表示しようとしているディスプレイプログラムからのものです。

これをすべて修正するには?まあ、あなたはあなたが本当に望むものを計算するようにあなたのプログラムを変更しようとする可能性があります。この場合、おそらくこのエラーは発生しません。 Maximaの表示プログラムも修正する必要があります。また、負の数のログの簡略化には不幸なことがあると思われますが、明らかにそうではありません。

これは元のポスターの情報が多すぎるかもしれませんが、おそらく上記の段落が助けて1つ以上の場所でMaximaを改善する可能性があります。

1

Maximaの簡略化(代数的アイデンティティ)コードでプログラムがエラーを引き起こすようです。私たちは調査中で、すぐにバグ修正があることを願っています。

一方、ここには考えがあります。 x <が0のとき、rnd(x、d)によってバグが引き起こされるようです。rndはxをd桁に丸めると思われます。 x <を処理するには、

rnd(x、d):=の場合x < 0 -rnd1(-x、d)else rnd1(x、d);

rnd1(x、d):=(...ここにrndの現在の定義を入れます。

これを行うと、ループが完了して実行され、Ibwdは値のリストですが、どの値を期待するかわかりません。

関連する問題