正如您所建议的那样,如果您绝对不希望在存储有理数时丢失准确性,则最佳解决方案可能是以整数组件的形式存储数字.
您可以将代表性减少为两个分量,而不是三个分量(f = a b / c):f = n / d.因此,每个有理数将被定义(并存储)为双分量整数向量[n d].例如,示例中的数字f对应于n = 5849991和d = 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