vpa

变精度算法(任意精度算法)

万博1manbetx对不定义数字的字符向量的支持已被删除。相反,首先使用以下命令创建符号数字和变量信谊信谊,然后对它们进行操作。例如,使用VPA((1个+ SQRT(符号(5)))/ 2)而不是vpa ((1 +√6 (5) / 2”)

描述

例子

vpa (x)使用可变精度浮点算术(VPA)到符号输入中的每个元素评价x至少d有效数字,d是的值数字函数。的默认值数字是32。

例子

vpa (x,d)使用至少d显著数字,而不是价值数字

例子

用可变精度算法计算符号输入

使用可变精度浮点算法计算符号输入。默认情况下,vpa计算到32位有效数字的值。

SYMS X P =符号(PI);piVpa = VPA(p)的
piVpa = 3.1415926535897932384626433832795
a =符号(1/3);f = a * sin (2 * p * x);fVpa = vpa (f)
fVpa = 0.33333333333333333333333333333333 * sin (6.283185307179586476925286766559 * x)

用可变精度算法计算向量或矩阵的元素。

V = [x/p a^3];M = [sin(p) cos(p/5);exp (p * x) x /日志(p)];vpa (V) vpa (M)
ans = [0.3183098861837906752674503 *x, 0.03703703703703703703703703703703703703703701718282] ans = [0, 0.8090169943747424102291718282]

请注意

你必须包装所有的内部输入vpa,如exp (vpa (200))。否则输入将被MATLAB自动转换为双精度®

所使用的更改精度vpa

默认情况下,vpa计算输入到32位有效数字。可以使用。来更改有效数字的数目数字函数。

近似表达式100001/10001使用7位有效数字数字。保存旧值数字通过返回数字(7)。的vpa函数只返回5位有效数字,这意味着其余的数字都是0。

digitsOld =数字(7);y =符号(100001)/ 10001;vpa (y)
ans = 9.9991

使用精度更高的值来检查其余的数字是否为零25。结果表明,其余数字实际上是一个循环小数。

数字(25)vpa (y)
ANS = 9.999100089991000899910009

另外,覆盖数字为一个vpa打电话,通过指定第二个参数改变的精度。

找到π- 100通过指定第二个参数有效数字。

VPA(PI,100)
ans = 3.141592653589793238462643383279502884197169……39937510582097494459230781640628620899862803……4825342117068

恢复原来的精度值digitsOld进行进一步的计算。

数字(digitsOld)

数值近似的符号结果

虽然符号结果是精确的,但它们可能不是一种方便的形式。您可以使用vpa在数字上近似精确的符号结果。

求一个高次多项式的根解决。的解决功能不能象征性地解决高次多项式,并使用表示根

syms x y =解(x^4 - x + 1, x)
y =根(z^4 - z + 1, z, 1)根(z^4 - z + 1, z, 2)根(z^4 - z + 1, z, 3)根(z^4 - z + 1, z, 4)

使用vpa来计算根的近似值。

yVpa = vpa (y)
yVpa我0.72713608449119683997667565867496 + 0.43001428832971577641651985839602 = 0.72713608449119683997667565867496 - 0.43001428832971577641651985839602 - 0.72713608449119683997667565867496 - 0.93409928946052943963903028710582 - 0.72713608449119683997667565867496 + 0.93409928946052943963903028710582我

vpa使用保护数字来保持精度

的价值数字函数指定使用的有效数字的最小数目。在内部,vpa可以使用更多的数字吗数字指定。这些额外的数字称为保护数字,因为它们可以防止后续计算中的舍入错误。

数值近似1/3使用四位有效数字。

a = vpa(1/3, 4)
一个= 0.3333

近似的结果一个使用20位。结果表明,工具箱计算当在内部使用多于四个数字一个。由于舍入错误,结果中的最后一位数字是不正确的。

vpa (20)
ans = 0.33333333333303016843

避免隐藏的舍入错误

隐藏的舍入错误可能会导致意外的结果。

评估1/10使用默认的32位精度,然后使用10位精度。

a = vpa(1/10, 32) b = vpa(1/10, 10)
a = 0。1 b = 0。1

从表面上看,一个b是平等的。通过查找来检查它们是否相等a - b

a - b
ans = 0.000000000000000000086736173798840354720600815844403

这个差值不等于0,因为b与只计算10精度的数字,其包含的舍入误差大于一个。当你发现a - b,vpa接近b与32位。证明这种行为。

a - vpa(b, 32)
ans = 0.000000000000000000086736173798840354720600815844403

vpa恢复普通双精度输入的精度

与精确的符号值不同,双精度值内在地包含舍入错误。当你打电话vpa在双精度输入,vpa无法恢复丢失的精度,即使它返回的位数比双精度值多。然而,vpa能否识别和恢复表达式的精度p/,pπ/,(p/)1/2,2,10,在那里p是普通整数。

首先,证明vpa无法为双精度输入恢复精度。调用vpa对于双精度结果和相同的符号结果。

dp =日志(3);s =日志(信谊(3));dpVpa = vpa(dp) sVpa = vpa(s) d = sVpa - dpVpa
dpVpa = 1.0986122886681095600636126619065 sVpa = 1.09861228866810969139552369225 d = 0.00000000000000013133163257501600766255995767652

正如预期的那样,双精度结果与16的精确结果不同th小数位。

证明vpa恢复窗体表达式的精度p/,pπ/,(p/)1/2,2,10,在那里p是大小适中的整数,通过查找vpa调用双精度结果和精确的符号结果。的差异是0.0显示,vpa在双精度输入中恢复丢失的精度。

vpa (1/3)——vpa(1 /信谊(3))vpa(π)——vpa(信谊(π))vpa (1 /√(2))——vpa(1 /√(信谊(2)))vpa (2 ^ 66)——vpa(2 ^符号(66))vpa (10 ^ 25)——vpa(10 ^符号(25)
0.0 ans = 0.0 ans = 0.0 ans = 0.0 ans = 0.0 ans = 0.0 ans = 0.0 ans = 0.0 ans

输入参数

全部折叠

用于求值的输入,指定为数字、向量、矩阵、多维数组或符号数字、向量、矩阵、多维数组、表达式、函数或字符向量。

有效数字的数目,指定为整数。d必须大于1且小于 2 29 + 1

提示

  • vpa不将指数中的分数转换为浮点数。例如,vpa(^符号(2/5))返回^ (2/5)

  • vpa使用的位数比指定的位数多数字。这些额外的数字防止后续计算中的舍入错误,称为保护数字。

  • 当你打电话vpa对数值输入,如1/3,2 ^ (5),或罪(π/ 4)时,数值表达式将计算为包含舍入错误的双精度数字。然后,vpa在双精度数字上调用。若要得到精确的结果,请将数值表达式转换为符号表达式信谊。例如,近似实验(1), 采用vpa (exp(信谊(1)))

  • 如果第二个参数d不是整数,vpa四舍五入到最接近的整数回合

  • vpa恢复与表单匹配的数字输入的精度p/,pπ/,(p/)1/2,2,10,在那里p是普通整数。

  • 使用可变精度算术四舍五入的原子操作。

  • 变精度算法与IEEE浮点标准754之间的区别是

    • 里面的计算,被零除抛出一个错误。

    • 指数范围大于任何预定义的IEEE模式。vpa下溢下面大约10 ^( - 323228496)

    • 未实现非正态化的数字。

    • 0是没有符号的。

    • 的数量二进制在可变精度算法和IEEE预定义类型之间,结果尾数中的数字可能不同。

    • 只有一个表示。安静和信号之间没有区别

    • 没有浮点数异常可用。

之前介绍过的R2006a