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

f = 359.0 + 16241/16250.0

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

我认为处理这件事的最好方法永远不是存储值(value),而是存储它的因素,例如
% 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

如果您想在计算中实现任意高精度,您应该考虑将 variable-precision arithmetic ( vpa ) 与字符串参数一起使用。使用这种方法,您可以指定所需的位数:
>> vpa('sqrt(pi)*5849991/16250', 50)
ans =
638.08240465923757600307902117159072301901656248436

关于matlab - 在 Matlab 中处理有理数而不损失计算精度?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20870085/

10-12 17:39