中有一个函数名为.docVIP

  1. 1、本文档共2页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Matlab中有一个函数名为eps,文档中对这个函数的说明是:Floating-point relative accuracy.它的具体功能是什么呢? 数字计算机所处理和存储的数据,都是量化过的数据,因此不能拥有任意的精度。对于以整数形式保存的数据,数与数的最小间隔为1,不能再小。而float类型同样,数与数之间存在一个最小间隔,但这个间隔并不是常数,而是随着数字的大小而改变的。举一个简单的例子,我们用科学计数法来表示数值,规定尾数部分只能保留一位小数。那么1.0×102,与它相邻的数字有1.1×102,处在这两个数中间的数值无法精确表示,因为只能保留一位小数。这两个相邻的数字的间隔是多少呢?1.1×102-1.0×102=10。也就是说,在这种计数方式的制约下,我们所能表示的数都是以十为间隔。但是这并不是一成不变的,对于1.0×103而言,与它相邻的数有1.1×103,处于这两个数中间的数值无法精确表示。它们的间隔是1.1×103-1.0×103=100。此时我们能够用这种计数方式表示的数以100为间隔。可见数值越大,精度越低。 对于使用二进制存储浮点数的754标准而言,relative accuracy与上面所描述的十进制的情况类似。754标准所规定的存储方式与科学计数法很相似,但是有一些细节问题需要注意,如最高位的1不存储,指数部分的偏移量,inf,NaN的存储方式等等。 想要完全了解relative accuracy,一个简单的方法是自己实现一个eps函数,并与Matlab自备的eps进行比较。我试着写了一个,值得注意的是我所使用的版本是Matlab 7.7,代码中使用了typecast函数,该函数在7.x的早期版本中不存在。还有一点就是此代码用于常见的Intel处理器+Windows操作系统,如果在其它架构上编写类似代码,好像要考虑大小端模式的问题。 my_eps.m: function r=my_eps(d) d=abs(d); if ((d==inf) || isnan(d)) r=NaN; return; end bytes=typecast(d,uint8); e=typecast(bytes(end-1:end),uint16); switch class(d) case double, bs=4; subnum=52; zeronum=6; le_rmin=2^(-1074); case single, bs=7; subnum=23; zeronum=2; le_rmin=2^(-149); otherwise, error(Only Single Double classes are supported!); end if (d=realmin(class(d))) r=le_rmin; return; end e=bitshift(e,-bs)-subnum; e=bitshift(e,bs); e=typecast(e,uint8); r=typecast([zeros(1,zeronum,uint8) e],class(d)); 这段代码很简单,为了说明其原理,还是以十进制的科学计数法为例(假设只能保留一位小数): 对于一个数,想要知道与它与其最相邻的数之间的间隔,只要保持该数的指数部分不变,尾数部分最右边的那一位为1,其余为0即可,例如,我想知道1.2×108与相邻数之间的间隔,保持指数部分不变,尾数只有最右边一位为1,其余为0,得到:0.1×108。但事情并没有结束,得到的这个数的形式并不符合规范,我们必须保证尾数部分个位为1才行,所以要将尾数左移一位,左移的同时,要减少指数,移一位,指数就要减1,最终符合规范的数值是1.0×107。 原理是这样,但技术上的问题比较烦人。先看一下double类型的存储格式: SEEE EEEE EEEE MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM MMMM S代表符号位,E代表指数位,M代表尾数。为了取得指数的数值,须将最左边的两个字节左移4位: 0000 0EEE EEEE EEEE 然后将尾数部分的最右边一位置1,其余为0。为了符合规范,须将这个唯一的1移动到尾数的各位上,这一操作一共要左移52

文档评论(0)

wxiw587 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档