【问题标题】:Why doesn't precision in Mathematica work consistently, or sometimes not at all?为什么 Mathematica 中的精度不能始终如一地工作,或者有时根本不工作?
【发布时间】:2019-05-14 21:30:43
【问题描述】:

考虑以下终止十进制数。

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

在这种情况下,DecimalForm[] 和 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[] 有效,有时似乎没有任何效果。

是我遗漏了什么还是系统中存在错误?

【问题讨论】:

    标签: decimal wolfram-mathematica precision


    【解决方案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 的整数部分的数值近似值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 2017-12-06
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      相关资源
      最近更新 更多