How to| 控制数值结果的精度和准确度

Wolfram 语言既可以处理确切的数量也可以应对近似数值. 使用 N,您可以任意精度或准确度获得一个确切量的数值近似. 在涉及到任意精度近似数的计算中,Wolfram 语言对数值误差的增长进行追踪. 使用高精度数可以得到其它数值系统所无法得到的准确结果.

Wolfram 语言尽可能给出确切答案:

N 来得到一个确切数的数值近似:

在 Wolfram 语言中,精度 实际上指的是有效数字的个数. 您可以用 N 的第二个参数指定结果的精度. 得到一个精度为50的结果:

准确度实际上指的是小数点后的正确位数. 将 {,a} 作为 N 的第二个参数给出,可以得到一个准确度为 a 的结果. 其中 表示任意精度. 例如,指定精确度为10:

PrecisionAccuracy 可以得到任何数的精度和准确度. 对 N 中结果的精度和准确度进行确定:

num`n 直接输入一个精度为 n 位的数值,用 num``a 直接输入一个准确度为 a 位的数值:

    

Wolfram 语言可以处理确切数值以及两种不同类型的近似数值:利用您计算机上的专用硬件来实现快速运算的机器精度数,和精确到指定位数的任意精度数.

确切数值的精度和准确度是无穷大:

用十进位记数法输入的数字通常被解释为机器精度数,具有精度 MachinePrecision

在缺省情况下,N 的结果是一个机器精度数:

机器精度数包含的位数通常略低于16,对应于确切的53比特:

任意精度数使用 num`nnum``a 输入. 输入一个10位精度的任意精度数以及一个10位准确度的类似数值:

指定 x 的精度为10表示它的准确度为一定值,该值在这里小于10. 差值(Precision[x]-Accuracy[x])实际上是数值的幅度,由 RealExponent[x] 给出:

指定 y 的准确度为10表示精度为一定值,该值在这里大于10:

一个数的准确度可以为负,表示已知的所有正确位数在小数点的左边:

    

MachinePrecision 被认为低于其它任何精度. 原因在于,尽管机器精度数所存放的位数总是略低于16,我们并不知道有多少位数是正确的.

这里,机器精度结果的所有位数都是正确的(使用 InputForm 显示一个近似数的所有非零位):

这里,机器精度结果的所有位数都不正确,原因是相减的两个数用机器精度表示时几乎是完全相等的:

为保证 n 个正确位,使用 N[expr,n]. 得到10个正确位:

N 不能给出精度高于其输入值的结果. 这里,不可能用 N 得到精度为100位的结果,原因是输入值仅精确到10位:

这里不可能用 N 得到6位精度的结果,原因是输入的是一个机器精度的数,其精度应该小于任何其它精度:

如果已知一个近似数 numPrecision[num] 的精度高,可以使用 SetPrecision 对其精度进行显式设置. 得到一个对应于机器精度数0.5的任意精度数,其精度为20位:

    

当表达式中包含近似数时,通常不需要使用 N. Wolfram 语言会自动计算一个近似结果,并参照输入精度确定结果的精度. 一般地,结果的精度不同于输入中任何部分的精度.

将一个精度为10位的数与一个精度为1000位的数相加:

Precision 用于最新的输出(%),可以看到 Wolfram 语言确定的结果具有11位精度:

由于机器精度数具有的精度比其它数低,只要输入含有机器精度数,结果通常就是机器精度数.

/@Map 的简写形式)将 Precision 应用于涉及到机器精度数的计算列表的每一部分:

通常情况下,结果的精度与输入的精度最低部分相差不大:

在某些情况下,结果的精度可以比输入的精度小. 这往往发生在两个接近相等的近似数相减时:

当您需要特定精度或准确度的结果时,最好是给出确切的输入并使用 N. 这是因为 N 有时会暂时以高于您要求的精度进行计算,以使获得的结果满足您的指定.

得到 1- 的20位精度的近似值: