好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

单精度浮点数与机器精度解析.doc

3页
  • 卖家[上传人]:mg****85
  • 文档编号:33990509
  • 上传时间:2018-02-19
  • 文档格式:DOC
  • 文档大小:56KB
  • / 3 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 单精度浮点数与机器精度解析 一、单精度浮点数先来简单了解一下浮点数在计算机中的存储方式根据 IEEE 754 标准,单精度浮点数格式如下(所有位取 0):各部分解释单精度浮点数有 32 个二进制位,左侧是高位,右侧是低位最高位被指定为符号位,0 代表正数,1 代表负数指数部分将是 2 的幂次,其编码值(即上表 指数部分对应的八个二进制位)规定为指数的实际值加上偏移值 2^7-1=127,这是为了避免负数,将[-127, 128]映射到[0, 255],这样指数部分编码就可以简单地编排为[00000000, 11111111]例如指数部分为 00001000,十进制为8那么其所代表的实际指数是 8-127=-119,即要乘上 2-119最后 23 位尾数是不包含整数位的实际有效小数位规约数的整数位是 1,非规约数的整数位是0 规约形式的浮点数与非规约形式的浮点数指数部分的编码值在[1, 2e-2]内,且尾数部分的整数位是 1,这样的浮点数被称为规约形式的浮点数指数部分的编码值为 0,尾数非零,这样的浮点数被称为非规约形式的浮点数规约浮点数的尾数∈[1, 2),而非规约浮点数的尾数∈(0, 1)。

      需要注意,非规约数指数编码为 00000000,但指数实际值是-126,而非-127非规约浮点数被 IEEE 754-1985 标准采用是因为它的渐进式下溢出,而规约浮点数将导致突然式下溢出,具体原理不再展开 实际计算设符号位为 ssign(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(或者其他任何数) ,此时实际指数为 0,所以机器精度是 2−23×2E /1.0 三、C++程序实现利用库求值标准库中的 numeric_limits 类中包含了许多算数特殊值:上溢值: std::numeric_limits::max();规约下溢值: std::numeric_limits::min();非规约下溢值: std::numeric_limits::denorm_min();机器精度: std::numeric_limits::epsilon();其中 numeric_limits中 float 可以换成 int,double 等其它类型。

      实际二进制存储值std::string get_binary(float f){int index_byte, index_bit;unsigned int byte = 0;char ch, *p;std::string bin_f = "";p = (char *)(for (index_byte = sizeof(float)-1; index_byte>=0; index_byte--) {ch = *(p+index_byte); //从最高位开始取byte = ch; //将地址中 8 个二进制位赋值成十进制数for (index_bit = 1; index_bit=128) bin_f += "1";else bin_f += "0"; //判断首位是 1 还是 0byte <<= 1; //将当前位变成首位byte //确保始终 8 个二进制位}}return bin_f;}。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.