要处理有理数而又不损失Matlab中的计算精度?

LéoLéopoldHertz Jun-young

我想在计算中使用这个有理数而又不损失Matlab中图片的准确性:

f = 359.0 + 16241/16250.0

我认为存储(例如由于f = uint64(359.0 + 16241/16250.0)丢失准确性)在Matlab中被视为360。

我认为处理事情的最好方法是永远不要存储价值,而要存储诸如

% f = a + b/c
a = 359
b = 16241
c = 16250

然后通过变量a,b和c进行计算,并将结果显示为图片。

这是保持准确性的好方法吗?

路易斯·门多

如您所建议,如果您绝对不希望在存储有理数时失去准确性,那么最好的解决方案可能是以数字的整数形式存储数字。

除了三个组成部分(f = a + b/c)之外,您还可以将表示减少到两个组成部分:f = n/d因此,每个有理数将被定义(并存储)为两分量整数向量[n d]例如,f您的示例中的数字对应于n=5849991d=16250

为了简化以这种方式存储的有理数的处理,您可以定义一个辅助函数,在应用所需的操作之前,该函数将从[n d]表示形式转换为n/d

useInteger = @(x, nd, fun) fun(x,double(nd(1))/double(nd(2)));

然后

>> x = sqrt(pi);
>> nd = int64([5849991 16250]);
>> useInteger(x, nd, @plus)
ans =
  361.7719
>> useInteger(x, nd, @times)
ans =
  638.0824

如果要在计算中实现任意高精度,则应考虑对字符串参数使用可变精度算术(vpa使用这种方法,您可以指定所需的位数:

>> vpa('sqrt(pi)*5849991/16250', 50)
ans =
638.08240465923757600307902117159072301901656248436

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章