在Matlab中将两个变量乘以vpa - 高精度

时间:2015-06-07 20:17:48

标签: matlab numeric symbolic-math arbitrary-precision

我想确保两个变量ab与高精度相乘,即执行c和{{1}的乘积a具有任意精度(在我的情况下为50个正确的十进制数字):

b

给了我

a = vpa(10/3,50);  
b = vpa(7/13,50);  
c = eval(vpa(vpa(a,50)*vpa(b,50),50));      % I basically want to do just c = a*b;    

测试

a = 3.3333333333333333333333333333333333333333333333333
b = 0.53846153846153846153846153846153846153846153846154
c = 23.333333333333333333333333333333

给出

d = eval(vpa(c*13,50))

表示获得d = 23.333333333333333333333333333333333333335292490585 的乘法未执行50位有效数字。

这里有什么问题,但更重要的是,如何为c以及a*b等其他操作获得正确的结果?

1 个答案:

答案 0 :(得分:1)

首先,应该使用vpa('7/13',50)vpa(7,50)/13来避免丢失精确会费到7/13以双精度浮点计算的可能性(我相信vpa,就像sym,尝试猜测常见常数和有理分数,但你不应该依赖它。)

问题是,虽然ab存储为50位可变精度值,但仍然会根据默认值digits(32)执行乘法运算。 vpa的第二个参数似乎只是指定变量的精度,而不是任何后续的操作(文档在这方面没有特别的帮助)。

实现目标的一种方法是:

old_digits = digits(50);
a = vpa('10/3')
b = vpa('7/13')
c = a*b
d = 13*c
digits(old_digits);

另一种方法是对所有数学使用精确的符号表达式(可能更昂贵),然后在最后将结果转换为50位变量精度:

a = sym('10/3')
b = sym('7/13')
c = a*b
d = vpa(13*c,50)

两种方法都会为23.333333333333333333333333333333333333333333333333返回d