在Matlab中处理有理数而不失计算精度?

 用户geafr1kx8g 发布于 2023-02-07 11:07

我想在计算中使用这个有理数,而不会丢失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进行计算,并将结果作为图片给出.

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

2 个回答
  • 正如您所建议的那样,如果您绝对不希望在存储有理数时丢失准确性,则最佳解决方案可能是以整数组件的形式存储数字.

    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
    

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

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

    2023-02-07 11:08 回答
  • 也许,创建一个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
    

    2023-02-07 11:09 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有