Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/math/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Math 如何将一个数字近似到小数点后n位?_Math_Maxima - Fatal编程技术网

Math 如何将一个数字近似到小数点后n位?

Math 如何将一个数字近似到小数点后n位?,math,maxima,Math,Maxima,就在几周前(实际上我刚刚使用过几次),我已经开始在OSX的wxMaxima接口中使用maxima 我曾试图在网络上找到解决方案,但可能是因为我是盲人,或者可能是因为我没有在maxima的官方文档中搜索的经验,我还没有找到具体的解决方案 如何将一个数字近似为an小数位数?例如,如果我使用float(22/7),它会给我这个巨大的数字3.142857142857143,但我只想把它近似到小数点后第三位3.143我还没有找到一种使用来近似数字的方法,但我找到了一种使用来近似数字的方法 从: bfloa

就在几周前(实际上我刚刚使用过几次),我已经开始在OSX的
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位十进制数字)与euler
2.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
格式执行的舍入没有很好的定义。Maxima
printf
将其转换为通用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);