这段代码为什么会导致机器崩溃?
我试图运行此代码,但它总是崩溃:当它评估的最后一行这段代码为什么会导致机器崩溃?
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);
千里马崩溃。任何想法,为什么它可能发生?
非常感谢。
问题是,差异变成负数,你的舍入函数死亡与负面论点可怕。要了解这一点,我改变你的循环到:
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不评估这件事,直到它绝对必要,并且在评估代码中的某处,某件事情正在可怕地死去。
我不知道你的具体例子的“修复”,因为我不完全确定你想要做什么,但希望这给你足够的信息来找到它自己。
如果你想解构一个浮点数,我们首先要确保它是一个大浮点数。 说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在一个或多个地方。
看起来你的程序触发了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是一个值列表,但我不知道期望什么值。
那么,我得出的结论是,问题与四舍五入功能 - 没有它,它工作得很好。那么问题是什么? – Anne