数值精度
正如"精确和近似结果"讨论的那样,Mathematica 能处理任意位数的近似实数. 一般地,近似实数的精度(precision)是其在十进制下的,在计算中作为有效数字处理的位数. 近似实数的准确度(accuracy)是其在十进制下小数点后边的位数. 请注意,为了在数字处理上达到完全的一致,精度和准确度经常具有与数位的整数数目不相对应的值.
实数的精度和准确度.
| Out[1]= |  |
| Out[2]= |  |
| Out[3]= |  |
| Out[4]= |  |
| Out[5]= |  |
一个近似实数总是在它的值上具有一定的不确定性,这与我们所知之外的数位相关. 我们可以把精度看做是提供了这种不确定性的相对大小的一种测量. 而准确度给出了不确定性绝对大小的测量.
Mathematica 的设置可以使如果一个数
具有不确定性
,那么它的真实值可以位于大小为
从
到
的区间的任意位置. 我们定义一个具有准确度
的近似数的不确定性为
,而一个具有精度
的非零近似数的不确定性为
.
关于不确定性的精度和准确度定义.
加上或减去小于不确定性的一定数量没有明显可见的效果.
| Out[6]= |  |
| N[expr,n] | 使用任意精度数近似计算 expr 到 n 位精度 |
| N[expr] | 仅使用机器精度数据近似计算 expr |
使用任意精度和机器精度的数值计算.
Mathematica 区分两种近似实数: 任意精度 数和机器精度 数. 任意精度数能包含任何位数,并且保持它们的精度. 另一方面,机器精度数总是保护相同数目的位数,并且不保持它们的精度信息.
下面是近似等于

的机器精度数.
| Out[7]= |  |
| Out[8]= |  |
下面的详细讨论表明,机器精度数值直接利用用户的计算机系统的数值能力,因此使用它们可以使计算进行得很快. 但是机器精度数的灵活性比任意精度数差的多,并且可能需要困难度高的数值分析来确定它们获得的结果是否是正确的.
机器精度数.
| Out[9]= |  |
在这台电脑中,机器精度数具有略少于16位的十进制位数.
| Out[10]= |  |
当输入一个近似实数时,Mathematica 必须决定以机器精度还是任意精度处理它. 除非用户指明,否则,如果输入的数少于$MachinePrecision 位时,Mathematica 将以机器精度处理该数,否则如果用户输入更多的位数时,将以任意精度处理该数.
| 123.4 | 机器精度数 |
| 123.45678901234567890 | 某些计算机系统上的任意精度数 |
| 123.45678901234567890` | 所有计算机系统上的任意精度数 |
| 123.456`200 | 具有200位精度的任意精度数 |
| 123.456``200 | 具有200位准确度的任意精度数 |
| 1.234*^6 | 科学表示法下的机器精度数( ) |
| 1.234`200*^6 | 具有200位精度在科学表示法下的数 |
| 2^^101.111`200 | 具有200个二进制位精度的二进制数 |
| 2^^101.111`200*^6 | 科学表示法下的二进制数( ) |
数的输入形式.
当 Mathematica 打印数的时候,通常以尽可能容易阅读的形式给出. 但如果用户想取出由 Mathematica 显示出的数,然后在后面作为 Mathematica 的输入使用,则需要保证没有信息丢失.
在标准输出形式下,
Mathematica 显示一个数到6位,如下所示.
| Out[11]= |  |
在输入形式下,
Mathematica 显示出它所知道的所有位.
Out[12]//InputForm= |
| |  |
| Out[13]= |  |
在输入形式中,
Mathematica 明确指明数的精度,并给出额外的数位以确保该数能正确地进行重构.
Out[14]//InputForm= |
| |  |
Out[15]//InputForm= |
| |  |
控制数的显示形式.
NumberMarks 选项的缺省设置在 InputForm 中和诸如 ToString 和 OpenWrite 的函数中由 $NumberMarks 给出. 因此通过重新设置 $NumberMarks,能改变整个 InputForm 中被显示的形式.
若缺省地使
Mathematica 在输入形式中包含数记号.
| Out[16]= |  |
Out[17]//InputForm= |
| |  |
Out[18]//InputForm= |
| |  |
在进行数值计算中,有时不可避免地会出现所得结果低于用户想要的精度. 特别,当得到的数值结果非常接近0时,用户可能很想假定结果是真正的零. 函数 Chop 允许用户用精确的整数0代替接近0的近似实数.
| Chop[expr] | 用0代替 expr 中的所有小于 的近似实数 |
| Chop[expr,dx] | 用0代替小于 dx 的数 |
清除接近0的数.
| Out[19]= |  |
| Out[20]= |  |