可变精度算法(任意精度算法)
金宝app对不定义数字的字符向量的支持已被移除。相反,首先创建符号数字和变量使用信谊
和信谊
,然后对它们进行操作。例如,使用vpa(1 +√(信谊(5)))/ 2)
而不是vpa((1 +√6(5)/ 2”)
.
用可变精度浮点算法计算符号输入。默认情况下,vpa
计算值到32位有效数字。
Syms x p = sym(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, 0.80901699437494742410229341718282] [exp(3.1415926535897932384626433832795*x), 0.87356852683023186835397746476334*x]
请注意
必须用vpa
,如exp (vpa (200))
.否则,输入被MATLAB自动转换为双精度®.
vpa
默认情况下,vpa
将输入计算为32位有效数字。属性可以更改有效数字的数目数字
函数。
近似表达式100001/10001
使用7位有效数字数字
.保存旧价值数字
返回的数字(7)
.的vpa
函数只返回5位有效数字,这可能意味着其余的数字都是零。
digitsOld =数字(7);y =符号(100001)/ 10001;vpa (y)
ans = 9.9991
检查剩余的数字是否为零,使用更高精度的值25
.结果表明,剩下的数字实际上是循环小数。
数字(25)vpa (y)
ans = 9.999100089991000899910009
另外,覆盖数字
为一个vpa
调用时,通过指定第二个参数更改精度。
通过指定第二个参数找到π到100位有效数字。
vpa(π,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
差不等于零,因为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.0986122886681096913952452369225 d = 0.0000000000000000000013133163257501600766255995767652
正如预期的那样,双精度结果与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)
Ans = 0.0 Ans = 0.0 Ans = 0.0 Ans = 0.0 Ans = 0.0 Ans = 0.0
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之间的差异是
在计算内部,除以0会抛出一个错误。
指数范围大于任何预定义的IEEE模式。vpa
下溢下面大约10 ^ (-323228496)
.
未实现非正规化数。
零是没有符号的。
的数量二进制在可变精度算法和IEEE预定义类型之间,结果尾数中的数字可能不同。
只有一个南
表示。安静和发信号之间没有区别南
.
没有浮点数异常可用。