DSP

浮点型四舍五入

2019-07-13 18:56发布

为何  atof()返回一个double,真的不明白double跟float在内存里的排列。如果不超出float范围,double低4字节和float一样吗? double  :符号1位,指数11位,尾数52位。
float    :符号1位,指数8位,尾数23位。
float和double的不同,除了范围,更重要的是精度。按10进制看,float大概在小数点后6~7位,double能达到15位。
1.2345678912用double可以精确表示,用float要发生截断。
如果不超出float范围,double低4字节和float一样吗    可能不一样,取决于小数点后的位数和它否可完全转换为2进制。     函数名称:          gcvt
函数原型:          char  *  gcvt(double  value,int  ndec,char   *buf)
函数功能:          将数值value转换为长度为ndec的字符串
函数返回:          指向buf的指针
参数说明:          value-要转换的浮点数值,ndec-转换后的长度
所属文件:          
#include  
#include  
int   main()
{
       char   str[25];
       double   num;
       int   sig=5;
       num=9.876;
       gcvt(num,sig,str);
       printf( "string=%s ",str);
       num=-123.4567;
       gcvt(num,sig,str);
       printf( "string=%s ",str);
       num=0.678e5;
       gcvt(num,sig,str);
       printf( "string=%s ",str);
       return(0);
}   .

函数名称:          ecvt
函数原型:          char  *ecvt(double  value,int  ndigIT,int  *dec,int   *sign)
函数功能:          将浮点数转换为字符串
函数返回:          转换后的字符串指针
参数说明:          value-待转换底浮点数,ndigIT-转换后的字符串长度
所属文件:          
#include  
#include  
#include  
int   main()
{
       char   *string;
       double   value;
       int   dec,sign;
       int   ndig=10;
       clrscr();
       value=9.876; 
       string=ecvt(value,ndig,&dec,&sign);
       printf( "string=%s  dec=%d   sign=%d",string,dec,sign);
       value=-123.45;
       ndig=   15;
       string=ecvt(value,ndig,&dec,&sign);
       printf( "string=%s  dec=%d   sign=%d",string,dec,sign);
       value=0.6789e5;
       ndig=5;
       string=ecvt(value,ndig,&dec,&sign);
       printf( "string=%s  dec=%d   sign=%d",string,dec,sign);
       return   0;
}
函数名称:          fcvt
函数原型:          char  *fcvt(double  value,int  ndigIT,int  *dec,int   *sign)
函数功能:          将浮点数变成一个字符串
函数返回:          转换后字符串指针
参数说明:          value-待转换底浮点数,ndigIT-转换后底字符串长度
所属文件:           #include  
#include  
#include  
int   main()
{
       char   *string;
       double   value;
       int   dec,sign;
       int   ndig=10;
       clrscr(); 
      value=9.876;
       string=fcvt(value,ndig,&dec,&sign);
       printf( "string=%s  dec=%d   sign=%d",string,dec,sign);
       value=-123.45;
       ndig=15;
       string=ecvt(value,ndig,&dec,&sign);
       printf( "string=%s  dec=%d   sign=%d",string,dec,sign);
       value=0.6789e5;
       ndig=5;
       string=fcvt(value,ndig,&dec,&sign);
       printf( "string=%s  dec=%d   sign=%d",string,dec,sign);
       return   0;
}    从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更高的精度。        任何数据在内存中都是以二进制(0或1)顺序存储的,每一个1或0被称为1位,而在x86CPU上一个字节是8位。比如一个16位(2字节)的short  int型变量的值是1000,那么它的二进制表达就是:00000011  11101000。由于Intel  CPU的架构原因,它是按字节倒序存储的,那么就因该是这样:11101000  00000011,这就是定点数1000在内存中的结构。        目前C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。下面是具体的规格: ````````符号位  阶码  尾数   长度
float        1          8      23      32  double      1        11        52      64
临时数      1        15        64      80 由于通常C编译器默认浮点数是double型的,下面以double为例:
共计64位,折合8字节。由最高到最低位分别是第63、62、61、……、0位:
        最高位63位是符号位,1表示该数为负,0正;
       62-52位,一共11位是指数位;
       51-0位,一共52位是尾数位。