matlab中如何计算信号的功率_MATLAB中计算极小数

e6c1fd37c5552d3b51d2261d8ad1d6dd.png

直接在MATLAB中计算极小的数值时,MATLAB会将极小数直接认为为0。例如:

3e-20 * 2.3e-320 % ans = 0
log10(3e-20 * 2.3e-320) % ans=-Inf

可见,MATLAB将

equation?tex=3%5Ctimes10%5E%7B-20%7D
equation?tex=2.3%5Ctimes10%5E%7B-320%7D 的乘积认为为0。这在一些科学计算中是不可以忍受的。这里提供一种暴力的方法解决问题,这个方法就是自己写一个专门处理极小数值的类。将极小数拆分为指数项和参数项两个部分。
classdef ExtNum
    properties
        p1,
        p2
    end
...
end

这里面的p1和p2就是拆分后的两部分。一个极小数

equation?tex=%5Cnu 可以被拆分为
equation?tex=p_1%5Ctimes10%5E%7Bp_2%7D 这样的两个部分。

MATLAB提供算符重载的能力:

https://www.mathworks.com/help/releases/R2017a/matlab/matlab_oop/implementing-operators-for-your-class.html​www.mathworks.com

所以我们可以在类里面重构加法和乘法:

        function v = plus(o1,o2)
            factorDiff = o1.p2 - o2.p2;
            v = ExtNum();
            if factorDiff >= 0
                v.p1 = o1.p1 + o2.p1/power(10,factorDiff);
                v.p2 = o1.p2;
            else
                v.p1 = o1.p1/power(10,-factorDiff) + o2.p1;
                v.p2 = o2.p2;
            end
        end

        function v = mtimes(o1,o2)
            v = ExtNum();
            v.p1 = o1.p1*o2.p1;
            v.p2 = o1.p2+o2.p2;
            v = v.reConfigValue();
        end

我们也可以进一步重构控制台打印数值的函数

        function disp(obj)
            fprintf(1,'%.4f x E%dn',obj.p1,obj.p2);
        end

这样就可以对极小数进行正常计算了

ExtNum(2.3e-320) * ExtNum (3e-20) % ans = 6.8996 x E-340

具体的源代码和测试文件可以参考

HansenZhao/ExtNum​github.com
33b563005734ee570244f346535fc360.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值