主要内容

digits

更改使用的变量精度

说明

digits(d) 将涉及可变精度算术(例如 vpa)的符号计算精度设置为 d 位有效小数。默认值为 32 位。

示例

d1 = digits 返回当前 vpa 使用的精度。

示例

d1 = digits(d) 设置新的精度 d,并将旧精度返回到 d1 中。

示例

示例

全部折叠

默认情况下,MATLAB® 使用 16 位精度。要提高精度,请使用 vpavpa 的默认精度为 32 位。通过使用 digits,可以将精度提高到 32 位以上。

使用 vpapi,其精度为默认的 32 位。使用 digits 确认当前精度为 32。

pi32 = vpa(pi)
pi32 = 3.1415926535897932384626433832795
currentPrecision = digits
currentPrecision = 
32

digits 的当前值保存到 d1 中,并将新精度设置为 70 位。使用 vpapi。结果是 70 位数。

d1 = digits(70);
pi100 = vpa(pi)
pi100 = 3.141592653589793238462643383279502884197169399375105820974944592307816

请注意,vpa 将返回符号输出。要将符号输出与不接受符号值的 MATLAB 函数结合使用,请使用 double 将符号值转换为双精度值。

最后,还原 digits 的旧值以进行后续计算。

digits(d1)

有关详细信息,请参阅Increase Precision of Numeric Calculations

通过使用精度较低的 vpa 来提高 MATLAB 计算的速度。使用 digits 设置较低的精度。

首先,求对大型输入执行运算所用的时间。

input = 1:0.01:500;
tic
zeta(input);
toc
Elapsed time is 21.361450 seconds.

现在,使用 vpa 以较低的精度重复该运算。通过使用 digits 将精度降低到 8 位。然后,使用 vpa 降低 input 的精度,并执行相同的运算。所用时间显著减少。

d1 = digits(8);
vpaInput = vpa(input);
tic
zeta(vpaInput);
toc
Elapsed time is 10.423610 seconds.

最后,还原 digits 的旧值以进行后续计算。

digits(d1)

有关详细信息,请参阅Increase Speed by Reducing Precision

使用 vpa 函数或 digits 函数指定的位数是保证的位数。工具箱内部使用的位数可能比您指定的位数多几位。这些额外的位数称为保护位数。例如,将位数设置为 4,然后用四位数字显示 1/3 的浮点近似值。

d1 = digits(4);
a = vpa(1/3)
a = 0.3333

现在,用 20 位数字显示 a。结果表明,工具箱在计算 a 时在内部使用了超过四位数字。由于存在舍入误差,以下结果的最后几位数字不正确。

d2 = digits(20);
vpa(a)
ans = 0.33333333333303016843

还原 digits 的旧值以进行后续计算。

digits(d1)

隐藏的舍入误差可能导致意外结果。例如,分别以默认的 32 位精度和 10 位精度计算数字 1/10。

a = vpa(1/10)
a = 0.1
d1 = digits(10);
b = vpa(1/10)
b = 0.1
digits(d1)

现在,计算差值 a - b。结果不为 0。

c = a - b
c = 0.000000000000000000086736173798840354720600815844403

差值 a - b 不等于零,因为工具箱内部将 10 位数字 b = 0.1 提升到 32 位精度。此过程会产生舍入误差。工具箱实际上按如下方式计算差值 a - b

b = vpa(b)
b = 0.09999999999999999991326382620116
c = a - b
c = 0.000000000000000000086736173798840354720600815844403

假设您将一个双精度浮点数转换为一个符号对象,然后对该对象应用 vpa 函数。结果可能取决于您将浮点数转换为符号对象的方法。您可以使用 sym 函数通过指定其可选的第二个参量来选择转换方法,该参量可以是 "r""f""d""e"。默认为 "r"。例如,将常数 π=3.141592653589793... 转换为符号对象。

r = sym(pi)
r = π
f = sym(pi,"f")
f = 

884279719003555281474976710656

d = sym(pi,"d")
d = 3.1415926535897931159979634685442
e = sym(pi,"e")
e = 

π-198eps359

尽管工具箱在屏幕上以不同方式显示这些数字,但它们都是 pi 的有理数近似值。使用 vpapi 的这些有理数近似值转换回浮点值。

将位数设置为 4。四个近似值中有三个得出相同的结果。

d1 = digits(4);
rvpa = vpa(r)
rvpa = 3.142
fvpa = vpa(f)
fvpa = 3.142
dvpa = vpa(d)
dvpa = 3.142
evpa = vpa(e)
evpa = 3.142-0.5515eps

现在,将位数设置为 40。pi 的符号近似值之间的差异变得更加明显。

d2 = digits(40);
rvpa = vpa(r)
rvpa = 3.141592653589793238462643383279502884197
fvpa = vpa(f)
fvpa = 3.141592653589793115997963468544185161591
dvpa = vpa(d)
dvpa = 3.1415926535897931159979634685442
evpa = vpa(e)
evpa = 3.141592653589793238462643383279502884197-0.5515320334261838440111420612813370473538eps

还原 digits 的旧值以进行后续计算。

digits(d1)

输入参数

全部折叠

新精度设置,指定为正整数标量。该设置指定用于可变精度计算的有效小数位数。d 必须大于 1 且小于 108+1。如果值 d 不是整数,则 digits 将其舍入到最接近的整数。

输出参量

全部折叠

当前精度设置,以双精度数形式返回。该设置指定当前用于可变精度计算的有效小数位数。

版本历史记录

在 R2006a 之前推出