How to| 控制数值结果的精度和准确度
Wolfram 语言既可以处理确切的数量也可以应对近似数值. 使用 N,您可以任意精度或准确度获得一个确切量的数值近似. 在涉及到任意精度近似数的计算中,Wolfram 语言对数值误差的增长进行追踪. 使用高精度数可以得到其它数值系统所无法得到的准确结果.
用 N 来得到一个确切数的数值近似:
在 Wolfram 语言中,“精度” 实际上指的是有效数字的个数. 您可以用 N 的第二个参数指定结果的精度. 得到一个精度为50的结果:
准确度”实际上指的是小数点后的正确位数. 将 {∞,a} 作为 N 的第二个参数给出,可以得到一个准确度为 a 的结果. 其中 ∞ 表示任意精度. 例如,指定精确度为10:
Wolfram 语言可以处理确切数值以及两种不同类型的近似数值:利用您计算机上的专用硬件来实现快速运算的机器精度数,和精确到指定位数的任意精度数.
用十进位记数法输入的数字通常被解释为机器精度数,具有精度 MachinePrecision:
在缺省情况下,N 的结果是一个机器精度数:
任意精度数使用 num`n 和 num``a 输入. 输入一个10位精度的任意精度数以及一个10位准确度的类似数值:
指定 x 的精度为10表示它的准确度为一定值,该值在这里小于10. 差值(Precision[x]-Accuracy[x])实际上是数值的幅度,由 RealExponent[x] 给出:
MachinePrecision 被认为低于其它任何精度. 原因在于,尽管机器精度数所存放的位数总是略低于16,我们并不知道有多少位数是正确的.
这里,机器精度结果的所有位数都是正确的(使用 InputForm 显示一个近似数的所有非零位):
这里,机器精度结果的所有位数都不正确,原因是相减的两个数用机器精度表示时几乎是完全相等的:
为保证 n 个正确位,使用 N[expr,n]. 得到10个正确位:
N 不能给出精度高于其输入值的结果. 这里,不可能用 N 得到精度为100位的结果,原因是输入值仅精确到10位:
这里不可能用 N 得到6位精度的结果,原因是输入的是一个机器精度的数,其精度应该小于任何其它精度:
如果已知一个近似数 num 比 Precision[num] 的精度高,可以使用 SetPrecision 对其精度进行显式设置. 得到一个对应于机器精度数0.5的任意精度数,其精度为20位:
当表达式中包含近似数时,通常不需要使用 N. Wolfram 语言会自动计算一个近似结果,并参照输入精度确定结果的精度. 一般地,结果的精度不同于输入中任何部分的精度.
将 Precision 用于最新的输出(%),可以看到 Wolfram 语言确定的结果具有11位精度:
由于机器精度数具有的精度比其它数低,只要输入含有机器精度数,结果通常就是机器精度数.
用 /@ (Map 的简写形式)将 Precision 应用于涉及到机器精度数的计算列表的每一部分:
在某些情况下,结果的精度可以比输入的精度小. 这往往发生在两个接近相等的近似数相减时:
当您需要特定精度或准确度的结果时,最好是给出确切的输入并使用 N. 这是因为 N 有时会暂时以高于您要求的精度进行计算,以使获得的结果满足您的指定.