How to| 控制数值结果的精度和准确度

Wolfram 语言既可以处理确切的数量也可以应对近似数值. 使用 N,您可以任意精度或准确度获得一个确切量的数值近似. 在涉及到任意精度近似数的计算中,Wolfram 语言对数值误差的增长进行追踪. 使用高精度数可以得到其它数值系统所无法得到的准确结果.

Wolfram 语言尽可能给出确切答案:

In[1]:=
Click for copyable input
Out[1]=

N 来得到一个确切数的数值近似:

In[2]:=
Click for copyable input
Out[2]=

在 Wolfram 语言中,精度 实际上指的是有效数字的个数. 您可以用 N 的第二个参数指定结果的精度. 得到一个精度为50的结果:

In[3]:=
Click for copyable input
Out[3]=

准确度实际上指的是小数点后的正确位数. 将 作为 N 的第二个参数给出,可以得到一个准确度为 a 的结果. 其中 表示任意精度. 例如,指定精确度为10:

In[4]:=
Click for copyable input
Out[4]=

PrecisionAccuracy 可以得到任何数的精度和准确度. 对 N 中结果的精度和准确度进行确定:

In[5]:=
Click for copyable input
Out[5]=

直接输入一个精度为 n 位的数值,用 直接输入一个准确度为 a 位的数值:

In[6]:=
Click for copyable input
Out[6]=
    

Wolfram 语言可以处理确切数值以及两种不同类型的近似数值:利用您计算机上的专用硬件来实现快速运算的机器精度数,和精确到指定位数的任意精度数.

确切数值的精度和准确度是无穷大:

In[1]:=
Click for copyable input
Out[1]=

用十进位记数法输入的数字通常被解释为机器精度数,具有精度 MachinePrecision

In[2]:=
Click for copyable input
Out[2]=

在缺省情况下,N 的结果是一个机器精度数:

In[3]:=
Click for copyable input
Out[3]=

机器精度数包含的位数通常略低于16,对应于确切的53比特:

In[4]:=
Click for copyable input
Out[4]=

任意精度数使用 输入. 输入一个10位精度的任意精度数以及一个10位准确度的类似数值:

In[5]:=
Click for copyable input
Out[5]=
In[6]:=
Click for copyable input
Out[6]=

指定 的精度为10表示它的准确度为一定值,该值在这里小于10. 差值(Precision[x]-Accuracy[x])实际上是数值的幅度,由 RealExponent[x] 给出:

In[7]:=
Click for copyable input
Out[7]=

指定 的准确度为10表示精度为一定值,该值在这里大于10:

In[8]:=
Click for copyable input
Out[8]=

一个数的准确度可以为负,表示已知的所有正确位数在小数点的左边:

In[9]:=
Click for copyable input
Out[9]=
    

MachinePrecision 被认为低于其它任何精度. 原因在于,尽管机器精度数所存放的位数总是略低于16,我们并不知道有多少位数是正确的.

这里,机器精度结果的所有位数都是正确的(使用 InputForm 显示一个近似数的所有非零位):

这里,机器精度结果的所有位数都不正确,原因是相减的两个数用机器精度表示时几乎是完全相等的:

In[2]:=
Click for copyable input
Out[2]=

为保证 n 个正确位,使用 N[expr,n]. 得到10个正确位:

In[3]:=
Click for copyable input
Out[3]=

N 不能给出精度高于其输入值的结果. 这里,不可能用 N 得到精度为100位的结果,原因是输入值仅精确到10位:

In[4]:=
Click for copyable input
Out[4]=

这里不可能用 N 得到6位精度的结果,原因是输入的是一个机器精度的数,其精度应该小于任何其它精度:

In[5]:=
Click for copyable input
Out[5]=

如果已知一个近似数 numPrecision[num] 的精度高,可以使用 SetPrecision 对其精度进行显式设置. 得到一个对应于机器精度数0.5的任意精度数,其精度为20位:

In[6]:=
Click for copyable input
Out[6]=
    

当表达式中包含近似数时,通常不需要使用 N. Wolfram 语言会自动计算一个近似结果,并参照输入精度确定结果的精度. 一般地,结果的精度不同于输入中任何部分的精度.

将一个精度为10位的数与一个精度为1000位的数相加:

In[1]:=
Click for copyable input
Out[1]=

Precision 用于最新的输出(),可以看到 Wolfram 语言确定的结果具有11位精度:

In[2]:=
Click for copyable input
Out[2]=

由于机器精度数具有的精度比其它数低,只要输入含有机器精度数,结果通常就是机器精度数.

Map 的简写形式)将 Precision 应用于涉及到机器精度数的计算列表的每一部分:

In[3]:=
Click for copyable input
Out[3]=

通常情况下,结果的精度与输入的精度最低部分相差不大:

In[4]:=
Click for copyable input
Out[4]=
In[5]:=
Click for copyable input
Out[5]=

在某些情况下,结果的精度可以比输入的精度小. 这往往发生在两个接近相等的近似数相减时:

In[6]:=
Click for copyable input
Out[6]=
In[7]:=
Click for copyable input
Out[7]=

当您需要特定精度或准确度的结果时,最好是给出确切的输入并使用 N. 这是因为 N 有时会暂时以高于您要求的精度进行计算,以使获得的结果满足您的指定.

得到 的20位精度的近似值:

In[8]:=
Click for copyable input
Out[8]=
In[9]:=
Click for copyable input
Out[9]=