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 的精确值
xU[ObW+HMӤ$׷Boo_V=vkL^_0 ?7}~ 4>70a]GdPdV;g<~77# $gM+v SQ*AV3h ˚/NÀWϾ}|kJx.K=x><ɜv[ x(d>"Y nLEIE#T.`Li !p3P0 14t)Es$I"&Xgo4  u<)+|޶@3H]d|(E#)Zom,ӧCRjͧ<Uo(͡zNޕ81VI$E!St N}OΜjWr5Fֆ=!FpƷ.ha짟TK~SH45(7 r 9&H"$hT_5u'VƩy8oTtrd]2?U2G1UXgɏA lދ@l%R9v:UB[Qo)꜆Ћ[ȳ ퟟ!8 y Tu7CKHȶJ?p{֓vs5Łsyc])G{xmTo/G +w^yˌ(bv=X[V?;),

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也不会有什么作用.

 

希望上述回答能够解答楼主的疑问(每个字都是现打的,绝无复制粘贴).