Mathematica 9 is now available

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 使用固定精度算法

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



Any questions about topics on this page? Click here to get an individual response.Buy NowMore Information
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.