3.1.5 任意精度的数当对任意精度的数进行计算时,Mathematica 在各处都保持对精度的跟踪. 一般,Mathematica 将尽力给出可能的最高精度,给出用户的输入具有的精度. Mathematica 把任意精度数处理为量的值. 这个量的某些位是已知的,其余位是未知的. 一般任意精度数 x 的由 Precision[x] 给出的位数是已知的,后面的无穷位是完全不知道的. 在计算中,Mathematica 保持跟踪结果的哪些位被输入中的未知位所影响, 并设置结果的精度使其不包含被影响的位.这个过程确保所得到的每一位都是 正确的,无论未知的位是什么值. 这里计算 (1/7),尽力得到 30 位精度
Out[1]= |  |
在上述情况下,结果有准确的 30 位精度
Out[2]= |  |
如果输入只有很小的精度,那么 Mathematica 不能给出那样高精度的输出
Out[3]= |  |
如果想要 Mathematica 假定 0.142 是精确的 142/1000 那么必须明确表示它
Out[4]= |  |
在许多计算中所得结果的精度因 "舍去误差" 而降低. 一个典型的情况是两个很接近 的数进行相减,所得结果依赖于每个数的高阶位.并且结果的精度比 原来数的精度低的多. 两个输入数都有 20 位的精度,但结果的精度低的多
Out[5]= |  |
在一个数中添加一些位而另一个数不添加,这样不能使添加的位在结果中表现出来
Out[6]= |  |
函数输出的精度以一个复杂的方式依赖于输入的精度. 变化很快的函数, 其输出精度较低,这是因为与输入中的不确定性有关的输出变化是更大的. 而接近于常数的函数给出的输出其精度比输入的更高. 像 Sin 这样的变化很快的函 数其输出的精度比其输入的精度低
Out[7]= |  |
这是计算到 20 位精度的 
Out[8]= |  |
所得结果与整数 1 相加,给出更高的精度
Out[9]= |  |
值得注意,以不同方式进行同一运算所得结果的精度是不大相同的. 在计算中,一旦损失了精度,它是不可能恢复的. 精度的损失就是 有关信息的丢失. 这是接近于 1 的 40 位数
Out[10]= |  |
其与 1 相加得出另一个 4 位数
Out[11]= |  |
最初的精度一直被保持
Out[12]= |  |
这种方式计算 1+x 将损失 精度
Out[13]= |  |
这种方式得出的结果精度相当低
Out[14]= |  |
以不同方式进行同一运算所得结果的精度不同意味着,其中包括两个近似实数间的比较 必须谨慎处理. 在测试两个实数是否 "相等" 时,Mathematica 先求出二者之差, 并检测结果是否在给定的精度内 "与 0一致". 这两个数在给定的精度内是相等的
Out[15]= |  |
Mathematica 用于计算数学函数的内部算法被设计来保持尽可能 高的精度. 大多数情况下,Mathematica 内部函数给出结果的精度与输入的精度很接近. 但在有些情况下,做不到这一点,Mathematica 将给出较低精度的结果. 如果输入 的精度较高. Mathematica 在内部计算中将使用较高的精度. 并且通常能给出较高 精度的结果. 数值计算 如果表达式仅包含整数和精确数值量,那么 N[expr, n] 在所有情况下 都 给出 位精度的结果. 应该认识到,要做到这一点,Mathematica 有时必须执行更高精度的内部中间运算. 全局变量 $MaxExtraPrecision 指定在中间计算中,允许多少额外的数位. 为了得到正确答案,Mathematica 自动增加内部运算的精度
Out[16]= |  |
使用缺省设置 $MaxExtraPrecision=50 Mathematica 不能得到正确答案
Out[17]= |  |
精度是 0 表明得不到任何正确的数位
Out[18]= |  |
告诉 Mathematica 在内部计算中用更多的位
Out[19]= |  |
现在得到了正确答案
Out[20]= |  |
将 $MaxExtraPrecision 重新设置为缺省值
Out[21]= |  |
Mathematica 存储着前面 的结果,故这里仍然给出正确答案
Out[22]= |  |
甚至在做给出精确结果的计算时,Mathematica 仍然偶尔使用某些内部运算中的近似数, 以使 $MaxExtraPrecision 的值能发挥作用. 在近似数的精度内 Mathematica 求出结果
Out[23]= |  |
在 $MaxExtraPrecision 的缺省值下,Mathematica 不能给出此式的结果
Out[24]= |  |
重设 $MaxExtraPrecision 使 Mathematica 得出结果
Out[25]= |  |
全局精度参数 当 Mathematica 在任意精度的未知位的潜在影响下工作时,它缺省地假定 这些位在不同的数中是完全无关的. 但这个假定不可能产生很高的精度,它能 导致不必要的精度损失. 特别,在一个计算中,如果两上数以同样的方式生成时, 它们的一些未知位可能是相等的. 那么当二者相减时,未知位可以相消. 但是在未知位总是无关的假定下,将丢失这样的相消. 这是一个计算到 20 位精度的数
Out[26]= |  |
1 + delta 有 34 位精度
Out[27]= |  |
由于 Mathematica 假定每个 delta 中的未知位是无关的. 故这个量也只有 34 位精度
Out[28]= |  |
数值计算有时依赖不同数的未知位间的相消而产生较高精度的结果. 如果能 确定未知位最终相消,那么用户可以明显地在未知位处引入任意数字, 在整个运算中使用这些任意数字,然后将它们消去,并得到更高精 度的结果. 修改精度和准确度的函数 这里给 delta 增加了 10 个任意的数字
Out[29]= |  |
这里增加的数字被消去
Out[30]= |  |
现在,结果的精度是 44 位,而不是 34 位
Out[31]= |  |
SetPrecision 通过在二进制添加0来增加精度. 有时 Mathematica 在任意 精度数中存贮的位数多于显示出来的位数,此时,SetPrecision 将在使用完这些额外的位数后再添加零. 设置一个数具有 40 位精度,额外的位来自二进制到 10 进行的换算
Out[32]= |  |
给出全局赋值 $MinPrecision = n,用户能在计算的每步有效地使用 SetPrecision[expr, n]. 这意味着既使任意精度数中的正确位数变得低于 , 该数将总是被添加到 位精度. 如果设置 $MaxPrecision= 以及 $MinPrecision= , 那么能迫使所有的任意精度数有固定的 位精度.结果, 这使 Mathematica 像处理机器精度数一样处理任意精度数, 但是有更高的精度. 固定精度计算使某些计算效率更高. 但是如果不仔细分析,将不能确定所得结果 有多少位是正确的. 这是具有 20 位精度的很小的数
Out[33]= |  |
在 Mathematica 通常的算法下,此式能被很好的计算
Out[34]= |  |
这里让 Mathematica 使用固定精度算法
Out[35]= |  |
结果的前几位是正确的但其余的是错误的
Out[37]= |  |
|