2011-07-24 150 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); 

千里馬崩潰。任何想法,爲什麼它可能發生?

非常感謝。

+0

那麼,我得出的結論是,問題與四捨五入功能 - 沒有它,它工作得很好。那麼問題是什麼? – Anne

回答

2

問題是,差異變成負數,你的舍入函數死亡與負面論點可怕。要了解這一點,我改變你的循環到:

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)); 

上次不同的印刷之前都失敗草草收場是-316539/6125000。所以現在試試

rnd(-1,3) 

並看到同樣的問題。這一切都源於這樣一個事實,即你正在取一個負數的對數,即Maxima通過分析延續解釋爲一個複數。 Maxima不評估這件事,直到它絕對必要,並且在評估代碼中的某處,某件事情正在可怕地死去。

我不知道你的具體例子的「修復」,因爲我不完全確定你想要做什麼,但希望這給你足夠的信息來找到它自己。

1

如果你想解構一個浮點數,我們首先要確保它是一個大浮點數。 說z: 34.1

您可以通過使用lisp來訪問bigfloat的部分,您還可以通過?fpprec訪問尾數長度的位數。

因此?second(z)*2^(?third(z)-?fpprec)爲您提供:

4799148352916685/140737488355328 

bfloat(%)爲您提供:

3.41b1. 

如果你想z的尾數爲整數,看?second(z) 現在,我不知道是什麼是你試圖完成10,但千里馬 不做內部算術的基數10.
如果你想要更多的位或更少,您可以設置鏈接到?fpprec的fpprec, 。 fpprec是「近似基數10」的精度。 因此fpprec最初是16 ?fpprec相應地是56.

你可以很容易地改變它們,例如, fpprec:100 相當於335

?fpprec如果您正在使用的浮點表示,diddling周圍,你可能會受益於知道 ,你可以通過輸入,例如看任何口齒不清的, ?print(z)

它使用Lisp打印功能打印內部表單。

您還可以跟蹤任何函數,您自己的或系統函數。對於n

trace(append,rnd,integrate); 

如果你想使用機器的花車,我建議你使用,最後一行,

30通1個-1 DO: 例如,你可以考慮做此

Ibwd:append([[n-1,rnd(1/(2.0*n- 1.0)-a*last(first(Ibwd)),d)]],Ibwd); 

請注意小數點。但即使這樣還不夠,因爲集成 會插入像atan(10)這樣的精確結構。試圖圍繞這些事情,或計算它們的日誌可能不是你想要做的。我懷疑Maxima是不高興的,因爲日誌給出了一些混亂的表達,結果是消極的,儘管它最初的想法是另外的。它把這個數字交給了lisp日誌程序,它非常樂意返回一個合適的common-lisp複數對象。不幸的是,Maxima大部分都是在LISP HAD COMPLEX NUMBERS之前編寫的。

因此結果(log -0.5)= #C(-0.6931472 3.1415927)是完全出乎意料的其餘的千里馬。 Maxima對複數有自己的形式,例如3+4*%i

尤其是,Maxima顯示程序早於常見的lisp複數格式,並不知道如何處理它。

錯誤(堆棧溢出!!!)是顯示程序試圖顯示一個常見的lisp複數。

如何解決這一切?那麼,你可以嘗試改變你的程序,以便計算你真正想要的,在這種情況下,它可能不會觸發這個錯誤。 Maxima的顯示程序也應該修復。另外,我懷疑在簡化數字記錄方面存在一些不幸的現象,這些記錄是負面的,但並不明顯。

這可能是太多的原始海​​報信息,但也許上面的段落將有所幫助,也可能改善Maxima在一個或多個地方。

1

看起來你的程序觸發了Maxima簡化(代數身份)代碼中的一個錯誤。我們正在調查,我希望我們很快就會有一個錯誤修復程序。

與此同時,這裏是一個想法。看起來像這個錯誤是由rnd(x,d)觸發的,當x < 0.我猜rnd應該將x舍入到d位。若要處理x < 0,請嘗試以下操作:

rnd(x,d):= if x < 0 then -rnd1(-x,d)else rnd1(x,d);

rnd1(x,d):=(...把rnd的定義放在這裏...);

當我這樣做時,循環運行完成,並且Ibwd是一個值列表,但我不知道期望什麼值。