我想在计算中使用这个有理数,而不会丢失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=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
如果要在计算中实现任意高精度,则应考虑将变精度arithmetic(vpa
)与字符串参数一起使用.使用这种方法,您可以指定所需的位数:
>> vpa('sqrt(pi)*5849991/16250', 50) ans = 638.08240465923757600307902117159072301901656248436
也许,创建一个Rational
类,并定义所需的操作(plus
,minus
,times
等).从这样的事情开始:
Rational.m
classdef Rational properties n; d; end methods function obj = Rational(n,d) GCD = gcd(n,d); obj.n = n./GCD; obj.d = d./GCD; end function d = dec(obj) d = double(obj.n)/double(obj.d); end % X .* Y function R = times(X,Y) chkxy(X,Y); if isnumeric(X), N = X .* Y.n; D = Y.d; elseif isnumeric(Y), N = X.n .* Y; D = X.d; else N = X.n .* Y.n; D = X.d .* Y.d; end R = Rational(N,D); end % X * Y function R = mtimes(X,Y) R = times(X,Y); end % X ./ Y function R = rdivide(X,Y) if isnumeric(Y), y = Rational(1,Y); else y = Rational(Y.d,Y.n); end R = times(X,y); end % X / Y function R = mrdivide(X,Y) R = rdivide(X,Y); end % X + Y function R = plus(X,Y) chkxy(X,Y); if isnumeric(X), N = X.*Y.d + Y.n; D = Y.d; elseif isnumeric(Y), N = Y.*X.d + X.n; D = X.d; else D = lcm(X.d,Y.d); N = sum([X.n Y.n].*(D./[X.d Y.d])); end R = Rational(N,D); end % X - Y function R = minus(X,Y) R = plus(X,-Y); end % -X function R = uminus(X) R = Rational(-X.n,X.d); end function chkxy(X,Y) if (~isa(X, 'Rational') && ~isnumeric(X)) || ... (~isa(Y, 'Rational') && ~isnumeric(Y)), error('X and Y must be Rational or numeric.'); end end end end
例子
构造对象:
>> clear all % reset class definition >> r1 = Rational(int64(1),int64(2)) r1 = Rational with properties: n: 1 d: 2 >> r2 = Rational(int64(3),int64(4)) r2 = Rational with properties: n: 3 d: 4
加减:
>> r1+r2 ans = Rational with properties: n: 5 d: 4 >> r1-r2 ans = Rational with properties: n: -1 d: 4
乘以除:
>> r1*r2 ans = Rational with properties: n: 3 d: 8 >> r1/r2 ans = Rational with properties: n: 2 d: 3
获取小数值:
>> r12 = r1/r2; % 2/3 ((1/2)/(3/4)) >> f = r12.dec f = 0.6667