请考虑以下终止十进制数字。
3.1 ^ 2 = 9.61
3.1 ^ 4 = 92.3521
3.1 ^ 8 = 8528.91037441
下面显示了Mathematica如何处理这些表达式
In[1]:= 3.1^2
Out[1]= 9.61
In[2]:= 3.1^4
Out[2]= 92.352
到目前为止很好,但是
In[3]:= 3.1^8
Out[3]= 8528.91
没有提供足够的精度。
因此,我们尝试使用精度为12的N [],NumberForm []和DecimalForm []
In[4]:= N[3.1^8,12]
Out[4]= 8528.91
In[5]:= NumberForm[3.1^8,12]
Out[5]= 8528.91037441
In[6]:= DecimalForm[3.1^8,12]
Out[6]= 8528.91037441
在这种情况下,DecimialForm []和NumberForm []可以按预期工作,但是N []仅提供了默认精度6,即使我要求的是12。所以DecimalForm []或NumberForm []似乎是实现此目的的方法。如果您想在输入以小数点结尾时获得准确的结果,请执行
。接下来考虑带无限重复小数的有理数,例如1/3。
In[7]:= N[1/3,20]
Out[7]= 0.33333333333333333333
In[9]:= NumberForm[1/3, 20]
Out[9]=
1/3
In[9]:= DecimalForm[1/3, 20]
Out[9]=
1/3
与前面的情况不同,N []似乎是此处的正确选择,而NumberForm []和DecimalForm []不考虑精度。
最后考虑非理性数字,例如Sqrt [2]和Pi。
In[10]:= N[Sqrt[2],20]
Out[10]= 1.4142135623730950488
In[11]:= NumberForm[Sqrt[2], 20]
Out[11]=
sqrt(2)
In[12]:= DecimalForm[Sqrt[2], 20]
Out[12]=
sqrt(2)
In[13]:= N[π^12,30]
Out[13]= 924269.181523374186222579170358
In[14]:= NumberForm[Pi^12,30]
Out[14]=
π^12
In[15]:= DecimalForm[Pi^12,30]
Out[15]=
π^12
在这些情况下,N []有效,但NumberForm []和DecimalForm []不起作用。但是,请注意,即使精度更高,N []也会在π^ 13处切换为科学计数法。有办法避免这种切换吗?
In[16]:= N[π^13,40]
Out[16]= 2.903677270613283404988596199487803130470*10^6
因此,似乎没有一致的方式来公式化如何以要求的精度获取十进制数,同时又避免了科学计数法。有时N []有效,有时DecimalForm []或NumberForm []有效,有时似乎什么也不起作用。
我错过了什么吗?或者系统中存在错误?
答案 0 :(得分:1)
这不是错误,因为它是有意设计为以这种方式运行的。精度受计算机精度,Mathematica的配置以及计算的算法和性能约束的限制。
N[expr, n]
的文档将其声明为attempts to give a result with n‐digit precision
。当它不能提供所要求的精度时,它会尽可能接近。 DecimalForm
和NumberForm
的工作方式相同。
https://reference.wolfram.com/language/ref/N.html解释了其背后的各种情况:
expr
中的数字精确或具有足够高的精度,否则N[expr,n]
可能无法给出n
位精度的结果。N[expr,n]
在内部可以进行超过n
位精度的计算。
$MaxExtraPrecision
指定内部将使用的最大精度额外位数。n
用十进制数字表示;它不必是整数。n
必须位于$MinPrecision
和$MaxPrecision
之间。 $MaxPrecision
可以设置为Infinity
。n
可以小于$MachinePrecision
。N[expr]
给出机器精度的数字,只要其大小在$MinMachineNumber
和$MaxMachineNumber
之间即可。N[expr]
等同于N[expr,MachinePrecision]
。N[0]
以机械精度给出数字0。N
将所有非零数字转换为Real
或Complex
形式。N
会将遇到的任何函数的每个连续参数转换为数字形式,除非函数的开头具有诸如NHoldAll
之类的属性。N[f[args]]:=value
和N[f[args],n]:=value
定义函数的数值。N[expr,{p,a}]
尝试生成精度最高为p
且精度最高为a
的结果。N[expr,{Infinity,a}]
尝试生成精度为a
的结果。N[expr,{Infinity,1}]
试图找到与expr
的整数部分近似的数值。