![e6c1fd37c5552d3b51d2261d8ad1d6dd.png](https://img-blog.csdnimg.cn/img_convert/e6c1fd37c5552d3b51d2261d8ad1d6dd.png)
直接在MATLAB中计算极小的数值时,MATLAB会将极小数直接认为为0。例如:
3e-20 * 2.3e-320 % ans = 0
log10(3e-20 * 2.3e-320) % ans=-Inf
可见,MATLAB将
classdef ExtNum
properties
p1,
p2
end
...
end
这里面的p1和p2就是拆分后的两部分。一个极小数
MATLAB提供算符重载的能力:
https://www.mathworks.com/help/releases/R2017a/matlab/matlab_oop/implementing-operators-for-your-class.htmlwww.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/ExtNumgithub.com![33b563005734ee570244f346535fc360.png](https://img-blog.csdnimg.cn/img_convert/33b563005734ee570244f346535fc360.png)