Math 如何将一个数字近似到小数点后n位?
就在几周前(实际上我刚刚使用过几次),我已经开始在OSX的Math 如何将一个数字近似到小数点后n位?,math,maxima,Math,Maxima,就在几周前(实际上我刚刚使用过几次),我已经开始在OSX的wxMaxima接口中使用maxima 我曾试图在网络上找到解决方案,但可能是因为我是盲人,或者可能是因为我没有在maxima的官方文档中搜索的经验,我还没有找到具体的解决方案 如何将一个数字近似为an小数位数?例如,如果我使用float(22/7),它会给我这个巨大的数字3.142857142857143,但我只想把它近似到小数点后第三位3.143我还没有找到一种使用来近似数字的方法,但我找到了一种使用来近似数字的方法 从: bfloa
wxMaxima
接口中使用maxima
我曾试图在网络上找到解决方案,但可能是因为我是盲人,或者可能是因为我没有在maxima的官方文档中搜索的经验,我还没有找到具体的解决方案
如何将一个数字近似为a
n
小数位数?例如,如果我使用float(22/7)
,它会给我这个巨大的数字3.142857142857143
,但我只想把它近似到小数点后第三位3.143
我还没有找到一种使用来近似数字的方法,但我找到了一种使用来近似数字的方法
从:
bfloat(expr)
将expr
中的所有数字和数字函数转换为bigfloat
数字。结果BigFloat中的有效位数
由全局变量fpprec
指定
因此,我可以通过这样的方式或多或少地实现我想要的:
bfloat(%e), fpprec:4;
输出为:
2.718b0
如果有人知道如何使用
float
功能执行此操作,请将其发布。fpprec
控制最大bigfloat中的实际有效位数。这只适用于大浮点,而不适用于普通(固定精度,IEEE 754)浮点
另请参见控制打印数字数量的fpprintprec
,它同样适用于大浮点数和普通浮点数。因此,另一个解决方案是:
(%i1) fpprintprec : 4 $
(%i2) float (22/7);
(%o2) 3.143
一种选择是定义
decimal_places(ex,n):=parse_string(printf(false,sconcat("~,",n,"f"),ex));
例如
但是,要小心将十进制数表示为二进制浮点数而导致的数字舍入(内部)
例如
返回1.4
printf(false,"~,3f",0.0145);
返回0.015
这也不是银行家的四舍五入(顺便说一句,“四舍五入”指的是。。。
比较轮(1.5);
与轮(2.5);
)
rnddp
将其第一个参数四舍五入到第二个参数中提供的小数位数
rndcdp
对复数也有同样的作用
结果是近似值,而不仅仅是显示的值。好的,它不仅控制打印的数字数量,还可以近似一个变量<代码>fpprintprec:4,x:float(%pi)代码>
x
将包含3.145
。我说的对吗?@Rinzler No,fpprintprec
对变量的值没有任何影响(既不是float也不是bigfloat)。当您将float(%pi)
分配给x
时,无论fpprintpec
是什么,它都是相同的值。再次尝试更改fpprintpec
并输出x
。您将看到不同的位数。是否有方法更改变量?例如,我需要将一个函数的一些结果(我需要大约3位十进制数字)与euler2.718
数的近似值进行比较,而不是与给定的最大值进行比较…@Rinzler我不确定我是否理解您的要求。听起来像是使用fpprec
和bfloat
是您想要的,因为您想要的结果具有不同的精度,而普通浮点具有固定的精度。但也许你可以说更多关于你想要达到的目标。这比我第一眼看到的要复杂得多。。。无论如何,不涉及字符串操作的小数位数函数的定义是:dp(e,n):=block([m],m:ceiling(log(float(e))/log(10.0)),float(e)*10^(n-m),round(%),%%*10.0^(m-n))
。例如,dp(%E,3)
=>2.72,dp(1000*%E,3)
=>2720.0,dp(%E/1000,3)
=>0.00272。关于小数位
的两条注释如上所示。(1) 通过在~f
格式化程序中使用v
可以指示printf输出中的可变精度,例如printf(true,“~,vf~%”,4,1.23456)
输出1.2346。(2) 对于以5
结尾的输入,对~f
格式执行的舍入没有很好的定义。Maximaprintf
将其转换为通用Lisp格式,而CL规范规定,以5
结尾的输入的舍入可以向上舍入,也可以向下舍入——这由Lisp实现来决定。我认为,这是规范中一个不幸的缺陷。
printf(false,"~,1f",1.45);
printf(false,"~,3f",0.0145);
rnddp(x,dp):=float((round(x*10^dp)/10^dp));
rndcdp(z,dp):=rnddp(realpart(z),dp)+%i*rnddp(imagpart(z),dp);