2011-07-24 121 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是一个值列表,但我不知道期望什么值。