你好,游客 登录 注册 搜索
背景:
阅读新闻

谈谈浮点数的IEEE标准——未完成 - Augusdi的专栏

[日期:2013-04-15] 来源:  作者: [字体: ]

     IEEE754标准是现在最通用的二进制算术运算标准,它被用于Sun,DEC,HP,IBM工作站以及所有的个人计算机。IEEE算术运算包括两类浮点数:单精度(float型,32位字长)和双精度(double型,64位字长)。除此之外,还有一个可选的扩展精度格式(long double,80位字长)。

      规范化的浮点数可以表示为

                  x=+-(1+f)*2^e

     其中f为小数或称为尾数,而e为指数。注意,这两个数都是以二进制表示的。

     其中f的取值范围为

                  0<=f<1

     gsl中提供了一些函数来把一个浮点数按照规范化的格式显示出来:

  1. void gsl_ieee_printf_float (const float * x)//将单精度浮点数按照规范化方式输出  
  2. void gsl_ieee_printf_double (const double * x)//将双精度浮点数按照规范化方式输出  

    调用这两个函数时,需要声明: #include <gsl/gsl_ieee_utils.h>

    举例而言,如果我们需要看看float型和double型的0.1的标准格式,可以使用如下代码:

  

  1. #include <stdio.h>  
  2. #include <gsl/gsl_ieee_utils.h>  
  3.        
  4. void main (void)   
  5. {  
  6.        float fx = 0.1;  
  7.        double dx = 0.1;  
  8.        
  9.        printf (" fx="); gsl_ieee_printf_float(&fx);   
  10.        printf ("/n");  
  11.        
  12.        printf (" dx="); gsl_ieee_printf_double(&dx);   
  13.        printf ("/n");  
  14. }  

输出结果分别为:

  fx= 1.10011001100110011001101*2^-4
 dx= 1.1001100110011001100110011001100110011001100110011010*2^-4

    如果你觉得ieee标准的0.1表示有些奇怪,那么就该进一步了解一下规范化浮点数在计算机中的存储格式:

    单精度与双精度浮点数的存储格式如下表:

格式长度符号位指数位e’小数位f
float32位1位8位23位
double64位1位11位52位

     以双精度格式为例分析之:

     由于它的小数位有52位,即252 *f必须是[0,252)区间内的整数。f的有限取值,造成了浮点数精度上的限制。

     而该格式的指数位共有11位,因此指数位可以表示[0,2047]区间的整数。但是需要注意的是,这里的指数位e' 并不等于指数e。实际上,指数区间[0,2047]上的两个极值0与2047被保留用于表示浮点数的例外值(后文将加以介绍);此外,为了能够兼顾在浮点数表示范围的上限与下限,规定:

     e=e'-1023,-1022<=e<=1023

     e的有限取值造成了浮点数范围上的限制。

     所以对于0.1而言,我们如果仔细写出它的二进制展开即有:

   0.1

    如果耐心计算,对于double型的0.1,有:

    f=(0.1001100110011001100110011001100110011001100110011010)2

    而e=-4+1023=1019

    这就不难理解gsl_ieee_printf_double(&dx)函数返回的结果。





收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻