matlab 为什么 a=1e41-1e22;vpa(a,50) 结果还是1e41怎么得出 1e41-1e22 的精确值
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/16 06:47:07
matlab 为什么 a=1e41-1e22;vpa(a,50) 结果还是1e41怎么得出 1e41-1e22 的精确值
matlab 为什么 a=1e41-1e22;vpa(a,50) 结果还是1e41
怎么得出 1e41-1e22 的精确值
matlab 为什么 a=1e41-1e22;vpa(a,50) 结果还是1e41怎么得出 1e41-1e22 的精确值
1、首先,明确一个基本概念:MATLAB中最基本的数据类型就是double,其大多数数值运算都是按照double类型进行的.楼上引用的百度百科的内容基本上没什么问题,我就不重复了.但是,出现这个现象的原因与double类型的表示范围无关,而是与它的精度(或者说分辨率)有关.
MATLAB中有一个eps函数用于计算浮点数的相对精度,在早期的版本(例如6.5),该函数不接受输入参数,而是直接返回一个数2^(-52);而在稍新一些版本的MATLAB上,eps可以接受输入,用以表示对于输入变量而言,其分辨率是多大,例如:
>> eps(1e41)ans =
1.9343e+025
也就是说,由于双精度浮点数的精度限制,对1e41这个量级的数来说,能够分辨的最小的数大约是1.9343e25,如果与小于这个分辨率的数据进行加减运算,都会被忽略不计.
更深入一点说,按照IEEE-754标准,double类型共64个二进制位,其中1个符号位,11个指数位,52个尾数位.这意味着,浮点数的相对精度是由52个尾数位决定的,这也是上面说到2^(-52)的由来,而2^(-52)按十进制大约是2.22e-16,介于1e-15和1e-16之间,这也是为什么说double类型的有效数字是15-16位的原因(15位肯定准确,16位不一定).
2、要想得到精确的计算结果,需要使用符号运算:
>> a = sym(1e41)-sym(1e22)a =
99999999999999999990000000000000000000000
你原来的代码中,虽然vpa是符号数学工具箱的函数,但由于前面的运算是按照double类型进行的,得到的结果 a 已经损失了精度,所以再使用vpa也不会有什么作用.
希望上述回答能够解答楼主的疑问(每个字都是现打的,绝无复制粘贴).