我想确保两个变量a
和b
与高精度相乘,即执行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
等其他操作获得正确的结果?
答案 0 :(得分:1)
首先,应该使用vpa('7/13',50)
或vpa(7,50)/13
来避免丢失精确会费到7/13
以双精度浮点计算的可能性(我相信vpa
,就像sym
,尝试猜测常见常数和有理分数,但你不应该依赖它。)
问题是,虽然a
和b
存储为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
。