为什么Mathematica中的精度不能始终如一地工作,有时甚至根本不工作?

时间:2019-05-14 21:30:43

标签: decimal wolfram-mathematica precision

请考虑以下终止十进制数字。

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 []有效,有时似乎什么也不起作用。

我错过了什么吗?或者系统中存在错误?

1 个答案:

答案 0 :(得分:1)

这不是错误,因为它是有意设计为以这种方式运行的。精度受计算机精度,Mathematica的配置以及计算的算法和性能约束的限制。

N[expr, n]的文档将其声明为attempts to give a result with n‐digit precision。当它不能提供所要求的精度时,它会尽可能接近。 DecimalFormNumberForm的工作方式相同。

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将所有非零数字转换为RealComplex形式。
  • N会将遇到的任何函数的每个连续参数转换为数字形式,除非函数的开头具有诸如NHoldAll之类的属性。
  • 您可以使用N[f[args]]:=valueN[f[args],n]:=value定义函数的数值。
  • N[expr,{p,a}]尝试生成精度最高为p且精度最高为a的结果。
  • N[expr,{Infinity,a}]尝试生成精度为a的结果。
  • N[expr,{Infinity,1}]试图找到与expr的整数部分近似的数值。