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 在计算最后一行时崩溃。任何想法为什么会发生?

太感谢了。

4

3 回答 3

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 不会对此进行评估,直到它绝对必须这样做,并且在评估代码的某个地方,某些东西正在可怕地死去。

我不知道您的具体示例的“修复”,因为我不确定您要做什么,但希望这可以为您提供足够的信息来自己找到它。

于 2011-07-27T21:45:55.517 回答
2

如果要解构一个浮点数,我们首先要确保它是一个 bigfloat。说 z: 34.1

您可以使用 lisp 访问 bigfloat 的各个部分,也可以通过?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 对应于?fpprec335。

如果您在使用浮点表示,您可能会受益于知道您可以通过键入来查看任何 lisp,例如, ?print(z)

它使用 Lisp 打印功能打印内部表单。

您还可以通过跟踪跟踪任何功能,您自己的或系统功能。例如,您可以考虑这样做:

trace(append,rnd,integrate);

如果你想使用机器花车,我建议你在最后一行使用,

对于从 30 到 1 步 -1 的 n,请执行以下操作:

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

注意小数点。但即使这样还不够,因为集成插入了像 atan(10) 这样的精确结构。尝试四舍五入或计算它们的日志可能不是您想要做的。我怀疑 Maxima 不高兴,因为 log 被赋予了一些混乱的表达,结果证明是负面的,即使它最初认为不是这样。它将数字交给 lisp 日志程序,该程序非常乐意返回适当的 common-lisp 复数对象。不幸的是,Maxima 的大部分内容是在 LISP 有复数之前编写的。

因此(log -0.5)= #C(-0.6931472 3.1415927),Maxima 的其他人完全出乎意料。Maxima 有自己的复数形式,例如3+4*%i.

特别是,Maxima 显示程序早于常见的 lisp 复数格式,并且不知道如何处理它。

错误(堆栈溢出!!!)来自显示程序试图显示一个常见的 lisp 复数。

如何解决这一切?好吧,你可以尝试改变你的程序,让它计算你真正想要的,在这种情况下,它可能不会触发这个错误。Maxima 的显示程序也应该是固定的。另外,我怀疑在简化负数但显然不是这样的数字对数时有些不幸。

对于原始海报来说,这可能是太多的信息,但也许上面的段落会有所帮助,也可能在一个或多个地方改进 Maxima。

于 2011-07-27T23:19:19.360 回答
1

您的程序似乎在 Maxima 的简化(代数恒等式)代码中触发了错误。我们正在调查,我希望我们能尽快修复错误。

与此同时,这里有一个想法。看起来该错误是由 rnd(x, d) 当 x < 0 时触发的。我猜 rnd 应该将 x 舍入为 d 位。要处理 x < 0,请尝试以下操作:

rnd(x, d) := 如果 x < 0 则 -rnd1(-x, d) 否则 rnd1(x, d);

rnd1(x, d) := (...把现在的rnd定义放在这里...);

当我这样做时,循环运行完成并且 Ibwd 是一个值列表,但我不知道期望什么值。

于 2011-07-30T22:30:36.687 回答