此为 Mathematica 4 文档,内容基于更早版本的 Wolfram 语言
查看最新文档(版本11.2)

3.1.5 任意精度的数

当对任意精度的数进行计算时,Mathematica 在各处都保持对精度的跟踪. 一般,Mathematica 将尽力给出可能的最高精度,给出用户的输入具有的精度. Mathematica 把任意精度数处理为量的值. 这个量的某些位是已知的,其余位是未知的. 一般任意精度数 x 的由 Precision[x] 给出的位数是已知的,后面的无穷位是完全不知道的.

在计算中,Mathematica 保持跟踪结果的哪些位被输入中的未知位所影响, 并设置结果的精度使其不包含被影响的位.这个过程确保所得到的每一位都是 正确的,无论未知的位是什么值.

这里计算 CapitalGamma(1/7),尽力得到 30 位精度

在上述情况下,结果有准确的 30 位精度

如果输入只有很小的精度,那么 Mathematica 不能给出那样高精度的输出

如果想要 Mathematica 假定 0.142 是精确的 142/1000 那么必须明确表示它

在许多计算中所得结果的精度因 "舍去误差" 而降低. 一个典型的情况是两个很接近 的数进行相减,所得结果依赖于每个数的高阶位.并且结果的精度比 原来数的精度低的多.

两个输入数都有 20 位的精度,但结果的精度低的多

在一个数中添加一些位而另一个数不添加,这样不能使添加的位在结果中表现出来

函数输出的精度以一个复杂的方式依赖于输入的精度. 变化很快的函数, 其输出精度较低,这是因为与输入中的不确定性有关的输出变化是更大的. 而接近于常数的函数给出的输出其精度比输入的更高.

Sin 这样的变化很快的函 数其输出的精度比其输入的精度低

这是计算到 20 位精度的

所得结果与整数 1 相加,给出更高的精度

值得注意,以不同方式进行同一运算所得结果的精度是不大相同的. 在计算中,一旦损失了精度,它是不可能恢复的. 精度的损失就是 有关信息的丢失.

这是接近于 1 的 40 位数

其与 1 相加得出另一个 4 位数

最初的精度一直被保持

这种方式计算 1+x 将损失 精度

这种方式得出的结果精度相当低

以不同方式进行同一运算所得结果的精度不同意味着,其中包括两个近似实数间的比较 必须谨慎处理. 在测试两个实数是否 "相等" 时,Mathematica 先求出二者之差, 并检测结果是否在给定的精度内 "与 0一致".

这两个数在给定的精度内是相等的

Mathematica 用于计算数学函数的内部算法被设计来保持尽可能 高的精度. 大多数情况下,Mathematica 内部函数给出结果的精度与输入的精度很接近. 但在有些情况下,做不到这一点,Mathematica 将给出较低精度的结果. 如果输入 的精度较高. Mathematica 在内部计算中将使用较高的精度. 并且通常能给出较高 精度的结果.

数值计算

如果表达式仅包含整数和精确数值量,那么 N[expr, n] 在所有情况下 都 给出  位精度的结果. 应该认识到,要做到这一点,Mathematica 有时必须执行更高精度的内部中间运算.

全局变量 $MaxExtraPrecision 指定在中间计算中,允许多少额外的数位.

为了得到正确答案,Mathematica 自动增加内部运算的精度

使用缺省设置 $MaxExtraPrecision=50 Mathematica 不能得到正确答案

精度是 0 表明得不到任何正确的数位

告诉 Mathematica 在内部计算中用更多的位

现在得到了正确答案

$MaxExtraPrecision 重新设置为缺省值

Mathematica 存储着前面 的结果,故这里仍然给出正确答案

甚至在做给出精确结果的计算时,Mathematica 仍然偶尔使用某些内部运算中的近似数, 以使 $MaxExtraPrecision 的值能发挥作用.

在近似数的精度内 Mathematica 求出结果

$MaxExtraPrecision 的缺省值下,Mathematica 不能给出此式的结果

重设 $MaxExtraPrecision 使 Mathematica 得出结果

全局精度参数

Mathematica 在任意精度的未知位的潜在影响下工作时,它缺省地假定 这些位在不同的数中是完全无关的. 但这个假定不可能产生很高的精度,它能 导致不必要的精度损失. 特别,在一个计算中,如果两上数以同样的方式生成时, 它们的一些未知位可能是相等的. 那么当二者相减时,未知位可以相消. 但是在未知位总是无关的假定下,将丢失这样的相消.

这是一个计算到 20 位精度的数

1 + delta 有 34 位精度

由于 Mathematica 假定每个 delta 中的未知位是无关的. 故这个量也只有 34 位精度

数值计算有时依赖不同数的未知位间的相消而产生较高精度的结果. 如果能 确定未知位最终相消,那么用户可以明显地在未知位处引入任意数字, 在整个运算中使用这些任意数字,然后将它们消去,并得到更高精 度的结果.

修改精度和准确度的函数

这里给 delta 增加了 10 个任意的数字

这里增加的数字被消去

现在,结果的精度是 44 位,而不是 34 位

SetPrecision 通过在二进制添加0来增加精度. 有时 Mathematica 在任意 精度数中存贮的位数多于显示出来的位数,此时,SetPrecision 将在使用完这些额外的位数后再添加零.

设置一个数具有 40 位精度,额外的位来自二进制到 10 进行的换算

给出全局赋值 $MinPrecision = n,用户能在计算的每步有效地使用 SetPrecision[expr, n]. 这意味着既使任意精度数中的正确位数变得低于  , 该数将总是被添加到  位精度.

如果设置 $MaxPrecision= 以及 $MinPrecision= , 那么能迫使所有的任意精度数有固定的 位精度.结果, 这使 Mathematica 像处理机器精度数一样处理任意精度数, 但是有更高的精度.

固定精度计算使某些计算效率更高. 但是如果不仔细分析,将不能确定所得结果 有多少位是正确的.

这是具有 20 位精度的很小的数

Mathematica 通常的算法下,此式能被很好的计算

这里让 Mathematica 使用固定精度算法

结果的前几位是正确的但其余的是错误的