2017-04-01 57 views
0

我已经编写了一个函数F,它按照一些特定的规则对输入进行四舍五入。例如,如果我的输入是F(0.1355),它将输出为1.4b-1。问题是,当我做F(0.1355)^2时,它给我1.96382999420166b-2,它应该给我0.14^2,即1.96b-2。这是为什么发生?并且,我该如何解决它?maxima中函数的输出

这是我的函数的代码:

F(x):=(block ([log10,aaa,fpprec],log10(x):=entier(log(x)/log(10)), 
    vnorm(x):= if x/(10^(log10(x)))<2 then 1/(10^(log10(x)-1)) else 1/10^(log10(x)), 
    aaa(x):= x*vnorm(x), 
    fpprec:if aaa(x)<20 then 2 else 1,bfloat((round(aaa(x)))*1/vnorm(x)))); ` 

更多信息:我不能声明fpprec为全局变量。我知道这会解决我的问题。 此致敬礼,

Lievet。

回答

1

好了,问题是,F(x)^2计算与fpprecblock,这是16。第一F(x)计算与fpprec = 2的值;称那个结果为foo。然后foo^2fpprec = 16计算。

我不知道一种方法来限制bigfloat计算精度到操作数的精度。简化规则(tellsimptellsimpafter)可能是可能的,但如果是这样的话,可能并不容易。

在这里取得一些进展的两个想法。 (1)考虑使用有理数而不是大浮点数。即返回7/5而不是1.4b-1。 (2)如果您只是想限制打印的数字,请使用fpprintprec

也许如果你在这里说更多关于你更大的目标是什么,有人会有一些建议。

+0

是的,它没有一个简单的解决方案。我不想把输出有理数,所以我没有考虑这个方法。无论如何,正如您指出的那样,我将使用fpprintprec,但仅限于显示。谢谢! – Topologicalife