- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
单精度浮点数与机器精度解析
一、单精度浮点数
先来简单了解一下浮点数在计算机中的存储方式。根据IEEE 754 标准,单
精度浮点数格式如下(所有位取0 ):
各部分解释
单精度浮点数有32 个二进制位,左侧是高位,右侧是低位。最高位被指定
为符号位,0 代表正数,1 代表负数。指数部分将是2 的幂次,其编码值(即上
表 指数部分对应的八个二进制位)规定为指数的实际值加上偏移值2^7-1=127,
这是为了避免负数,将[-127, 128]映射到[0, 255],这样指数部分编码就可以简单
地编排为。例如指数部分,十进制为8。那么其
所代表的实际指数是8-127=-119,即要乘上2-119 。最后23 位尾数是不包含整数
位的实际有效小数位。规约数的整数位是 1,非规约数的整数位是0 。
规约形式的浮点数与非规约形式的浮点数
指数部分的编码值在[1, 2e-2] 内,且尾数部分的整数位是 1,这样的浮点数
被称为规约形式的浮点数。
指数部分的编码值为0 ,尾数非零,这样的浮点数被称为非规约形式的浮点
数。
规约浮点数的尾数∈[1, 2),而非规约浮点数的尾数∈(0, 1) 。需要注意,非
规约数指数编码,但指数实际值是-126,而非-127 。非规约浮点数被
IEEE 754-1985 标准采用是因为它的渐进式下溢出,而规约浮点数将导致突然式
下溢出,具体原理不再展开。
实际计算
设符号位为 。sign(s)确定正负:sign(0)=1,sign(1)=-1;指数部分为 e ;尾
数部分为f 。用(N)2 表示二进制数N 。
规约形式:sign(s)*2e-127*(1.f)2
非规约形式:sign(s)*2-126*(0.f)2
特殊值和极值
上下溢出值
由浮点数的存储方式可以看出计算机所能表示的浮点数是有限的,我们把所
能表示的最大正值称为上溢值,而把最接近0 的正值称为下溢值。由表二我们看
到上溢值为±3.40e38,下溢值为±1.40e-45。
二、机器精度
Wikipedia 上机器精度Machine Epsilon 是这样描述的:“Machine epsilon gives
an upper bound on the relative error due to rounding in floating point arithmetic” 。因
为浮点数是离散的,所以实数的表示存在着误差。例如圆周率这样的无限不循环
小数不可能精确地由某一个浮点数表示。
我们需要一些具体的量去刻画这种误差,以估计结果的准确性。机器精度便
是其中之一:它是所有相对误差的上限。相对误差是绝对误差与精确值的比值的
绝对值。例如一个精确的实数x ,所有单精度浮点数中与x 距离最近的数为y,
绝对误差为|y-x|,相对误差即|y−x|/|x| ,而所有相对误差的上限便是单精度浮点数
的机器精度。
对于32 位浮点数,指数 8 位,尾数为23 位。对于两个指数实际值为E 的
相同的浮点数,若它们尾数部分相差(00000000000000000000001)2,即 2-23 ,易
见它们是相邻的。那么与它们指数相同的实数x 与距x 最近的浮点数y 之间的距
离|y-x|一定小于此相邻两浮点数的距离2-23 * 2E 。可以取x=1.0(或者其他任何数),
−23 E
此时实际指数为0 ,所以机器精度是2 ×2 /1.0 。
三、C++程序实现
利用库求值
标准库limits 中的numeric_limits 类中包含了许多算数特殊值:
上溢值: std::numeric_limitsfloat::max();
规约下溢值: std::numeric_limitsfloat::min();
非规约下溢值: std::numeric_limitsfloat::denorm_min();
机器精度: std::numeric_limitsfloat::epsilon();
其中numeric_limitsfloat 中float 可以换成int ,doubl 等其它类型。
实际二进制存储值
std::s
文档评论(0)