数值精度

正如"精确和近似结果"讨论的那样,Mathematica 能处理任意位数的近似实数. 一般地,近似实数的精度(precision)是其在十进制下的,在计算中作为有效数字处理的位数. 近似实数的准确度(accuracy)是其在十进制下小数点后边的位数. 请注意,为了在数字处理上达到完全的一致,精度和准确度经常具有与数位的整数数目不相对应的值.

Precision[x]x 的十进制下的有效数位的总数
Accuracy[x]x 的十进制下小数点后边的有效数位的数目

实数的精度和准确度.

这里产生一个具有30位精度的数.
In[1]:=
Click for copyable input
Out[1]=
这里给出该实数的精度.
In[2]:=
Click for copyable input
Out[2]=
准确度相对较低,因为这里小数点后边只有部分位数.
In[3]:=
Click for copyable input
Out[3]=
该数具有小数点右边的所有位数.
In[4]:=
Click for copyable input
Out[4]=
现在准确度大于精度.
In[5]:=
Click for copyable input
Out[5]=

一个近似实数总是在它的值上具有一定的不确定性,这与我们所知之外的数位相关. 我们可以把精度看做是提供了这种不确定性的相对大小的一种测量. 而准确度给出了不确定性绝对大小的测量.

Mathematica 的设置可以使如果一个数 具有不确定性 ,那么它的真实值可以位于大小为 的区间的任意位置. 我们定义一个具有准确度 的近似数的不确定性为 ,而一个具有精度 的非零近似数的不确定性为 .

关于不确定性的精度和准确度定义.

加上或减去小于不确定性的一定数量没有明显可见的效果.
In[6]:=
Click for copyable input
Out[6]=
N[expr,n]使用任意精度数近似计算 exprn 位精度
N[expr]仅使用机器精度数据近似计算 expr

使用任意精度和机器精度的数值计算.

Mathematica 区分两种近似实数: 任意精度 数和机器精度 数. 任意精度数能包含任何位数,并且保持它们的精度. 另一方面,机器精度数总是保护相同数目的位数,并且不保持它们的精度信息.

下面是近似等于 的机器精度数.
In[7]:=
Click for copyable input
Out[7]=
这两个都是任意精度数.
In[8]:=
Click for copyable input
Out[8]=

下面的详细讨论表明,机器精度数值直接利用用户的计算机系统的数值能力,因此使用它们可以使计算进行得很快. 但是机器精度数的灵活性比任意精度数差的多,并且可能需要困难度高的数值分析来确定它们获得的结果是否是正确的.

MachinePrecision用来表明机器精度数的精度规格
$MachinePrecision用户的计算机系统的机器精度
MachineNumberQ[x]检验 x 是否是一个机器精度数

机器精度数.

这里返回标记 MachinePrecision 来表明这是一个机器精度数.
In[9]:=
Click for copyable input
Out[9]=
在这台电脑中,机器精度数具有略少于16位的十进制位数.
In[10]:=
Click for copyable input
Out[10]=

当输入一个近似实数时,Mathematica 必须决定以机器精度还是任意精度处理它. 除非用户指明,否则,如果输入的数少于$MachinePrecision 位时,Mathematica 将以机器精度处理该数,否则如果用户输入更多的位数时,将以任意精度处理该数.

123.4 机器精度数
123.45678901234567890 某些计算机系统上的任意精度数
123.45678901234567890` 所有计算机系统上的任意精度数
123.456`200 具有200位精度的任意精度数
123.456``200 具有200位准确度的任意精度数
1.234*^6 科学表示法下的机器精度数(1.234x10^(6)
1.234`200*^6 具有200位精度在科学表示法下的数
2^^101.111`200 具有200个二进制位精度的二进制数
2^^101.111`200*^6 科学表示法下的二进制数(101.111_2x2^(6)

数的输入形式.

Mathematica 打印数的时候,通常以尽可能容易阅读的形式给出. 但如果用户想取出由 Mathematica 显示出的数,然后在后面作为 Mathematica 的输入使用,则需要保证没有信息丢失.

在标准输出形式下,Mathematica 显示一个数到6位,如下所示.
In[11]:=
Click for copyable input
Out[11]=
在输入形式下,Mathematica 显示出它所知道的所有位.
In[12]:=
Click for copyable input
Out[12]//InputForm=
这是一个标准输出形式下的任意精度数.
In[13]:=
Click for copyable input
Out[13]=
在输入形式中,Mathematica 明确指明数的精度,并给出额外的数位以确保该数能正确地进行重构.
In[14]:=
Click for copyable input
Out[14]//InputForm=
这里令 Mathematica 不明确指明精度.
In[15]:=
Click for copyable input
Out[15]//InputForm=
InputForm[expr,NumberMarks->True]在所有的近似数中使用记号
InputForm[expr,NumberMarks->Automatic]
只在任意精度数中使用记号
InputForm[expr,NumberMarks->False]不使用记号

控制数的显示形式.

NumberMarks 选项的缺省设置在 InputForm 中和诸如 ToStringOpenWrite 的函数中由 $NumberMarks 给出. 因此通过重新设置 $NumberMarks,能改变整个 InputForm 中被显示的形式.

若缺省地使 Mathematica 在输入形式中包含数记号.
In[16]:=
Click for copyable input
Out[16]=
甚至一个机器精度数现在也带有明显的数记号.
In[17]:=
Click for copyable input
Out[17]//InputForm=
即使不带数记号,InputForm 仍在科学表示法中使用 .
In[18]:=
Click for copyable input
Out[18]//InputForm=

在进行数值计算中,有时不可避免地会出现所得结果低于用户想要的精度. 特别,当得到的数值结果非常接近0时,用户可能很想假定结果是真正的零. 函数 Chop 允许用户用精确的整数0代替接近0的近似实数.

Chop[expr]用0代替 expr 中的所有小于10^(-10) 的近似实数
Chop[expr,dx]用0代替小于 dx 的数

清除接近0的数.

这个运算给出很小的虚部.
In[19]:=
Click for copyable input
Out[19]=
使用 Chop 可以略去虚部.
In[20]:=
Click for copyable input
Out[20]=
New to Mathematica? Find your learning path »
Have a question? Ask support »