提高数值计算的精度
默认情况下,MATLAB® 使用 16 位精度。要提高精度,请使用 Symbolic Math Toolbox™ 中的 vpa 函数。vpa 提供可变精度,且可无限制地提高精度。
当您选择可变精度算术时,vpa 默认采用 32 位有效小数位数的精度。有关详细信息,请参阅Choose Numeric or Symbolic Arithmetic。您可以使用 digits 函数设置更高的精度。
使用默认的 32 位精度近似求和。如果至少有一个输入是用 vpa 包装的,则所有其他输入会自动转换为可变精度。
vpa(1/3) + 1/2
ans = 0.83333333333333333333333333333333
您必须将所有内部输入用 vpa 包裹,例如 exp(vpa(200))。否则,MATLAB 会自动将这些输入转换为采用双精度。
通过使用 digits 将精度提高到 50 位,并将 digits 的旧值保存在 digitsOld 中。重复求和运算。
digitsOld = digits(50); sum50 = vpa(1/3) + 1/2
sum50 = 0.83333333333333333333333333333333333333333333333333
还原 digits 的旧值以进行后续计算。
digits(digitsOld)
注意
vpa 输出为符号形式。要将符号输出与不接受符号值的 MATLAB 函数结合使用,请使用 double 将符号值转换为双精度值。
通过调用 digits 检查当前的 digits 设置。
digits
Digits = 32
通过将精度指定为 vpa 的第二个输入,更改单次 vpa 调用的精度。此调用不会影响 digits。例如,用 100 位精度近似计算 pi。
vpa(pi,100)
ans = 3.14159265358979323846264338327950288419716939937510582097494 4592307816406286208998628034825342117068
digits % digits remains 32
Digits = 32
可变精度可以任意提高。求 pi,精确到 500 位。
digitsOld = digits(500); vpa(pi) digits(digitsOld)
ans = 3.1415926535897932384626433832795028841971693993751058209749 445923078164062862089986280348253421170679821480865132823066 470938446095505822317253594081284811174502841027019385211055 596446229489549303819644288109756659334461284756482337867831 652712019091456485669234603486104543266482133936072602491412 737245870066063155881748815209209628292540917153643678925903 600113305305488204665213841469519415116094330572703657595919 530921861173819326117931051185480744623799627495673518857527 248912279381830119491
digits 和 vpa 用于控制有效小数位数。例如,用四位精度近似计算 1/111 时,会返回小数点后六位数,因为前两位数为零。
vpa(1/111,4)
ans = 0.009009
注意
如果您希望通过降低精度来提高性能,请参阅Increase Speed by Reducing Precision。