`
huozheleisi
  • 浏览: 1238614 次
文章分类
社区版块
存档分类
最新评论

_gcvt(),_ecvt(),_fcvt()参数意义及区别 08.12.01

 
阅读更多

为何 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-转换后的长度
所属文件: <stdlib.h>

#include <stdlib.h>
#include <stdio.h>
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-转换后的字符串长度
所属文件: <stdlib.h>

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
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-转换后底字符串长度
所属文件: <stdlib.h>

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
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 823 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位是尾数位。 .


参考MSDN:http://msdn.microsoft.com/en-us/library/z4s4541k(VS.80).aspx

分享到:
评论

相关推荐

    对比分析C语言中的gcvt()和ecvt()以及fcvt()函数

    gcvt()与ecvt()和fcvt()不同的地方在于,gcvt()所转换后的字符串包含小数点或正负符号。若转换成功,转换后的字符串会放在参数buf 指针所指的空间。 返回值:返回一字符串指针,此地址即为buf 指针。 范例 #...

    C标准库源代码(学习C/C++必备)

    C标准库源代码\FCVT.C C标准库源代码\FDOPEN.C C标准库源代码\FEOFERR.C C标准库源代码\FFLUSH.C C标准库源代码\FGETC.C C标准库源代码\FGETCHAR.C C 标准库源代码\FGETPOS.C C标准库源代码\FGETS.C C标准库源代码\...

    tcl 入门学习.md

    Tcl_AppendResult(Interp,gcvt(arr[cnt2], sizeof(arr[cnt2]), buf), " ",NULL); } return 0; } int Numsort_Init(Tcl_Interp *Interp) { //login command Tcl_CreateObjCommand (Interp, "numsort", ...

    举一反三 第二章例证

    计算器, char cEdit1[10];char cEdit2[10]; //定义两个字符串,用于存放输入数据1和输入数据2 double dEdit1, dEdit2, dEdit3;... _gcvt(dEdit3,10,cResult); m_Edit3=(LPCTSTR)cResult; UpdateData(0);

    caculator.rar_Windows编程_Visual_C++_

    vc6.0相关安装配置,void CJisuanqiDlg::OnBUTTONdecimal() {// TODO: Add your control notification handler code heredecimal=true }void CJisuanqiDlg::... value=0 input1=0 input2=0 _gcvt(value

    \Linux c函数参考

    15 gcvt(将浮点型数转换为字符串,取四舍五入) ...................................................... 16 strtod(将字符串转换成浮点数) ...................................................................

    VC++客房管理系统源码

    i++) { _gcvt(i,3,tem); m_num.AddString(tem); } **************************************** msg+="\r\n\n"; 一级(100元/天) 二级(70元/天) 三级(40元/天) 房间级别 ***...

    mfc可视化计算器编程

    //主要通过_gcvt()和strtod()函数进行字符串和浮点数之间的转换 char buffer[30]; //定义个装字符的数组 _gcvt(m_Dis,sizeof(m_Dis),buffer); //把m_Dis存的数字转换为string for(int i=0;i;i++) { if...

    C语言库函数代码(内容详尽的源代码)

    C语言函数大全,已包含绝大部分的函数。每个函数包含函数名,功能,用法,举例,内容详尽的源代码。

    gcvt:更绿色的连通性可视化工具

    更绿色的连通性可视化工具 :construction: :female_sign:‍:female_sign: 工作正在进行中 :construction_worker: :construction: GCVT的目标是可视化和比较不同情况下的运输模型输出。安装该项目主要使用两种编程...

    单片机中用C语言实现各种数制之间转换

    单片机中用C语言实现各种数制之间转换,写程序时直接复制即可,无需更改!

    linux_c API函数大全

    gcvt(将浮点型数转换为字符串,取四舍五入) 23 2.5 24 strtod(将字符串转换成浮点数) 24 2.6 24 strtol(将字符串转换成长整型数) 24 2.7 25 strtoul(将字符串转换成无符号长整型数) 25 2.8 25 toascii(将...

    ICCAVR的库函数

    包含了用ICCAVR开发的各种芯片接口程序库,如i2c接口,PCF8563接口,ST7920接口,PS2接口灯

    C/C++字符串与数字互转的实现

    C数字转字符串 ...//浮点数转字符串,number为要转换的数,ndigit表示要转换的位数, decpt和sign为输出参数,decpt为小数点位 //数,sign为符号。返回转换后的字符串,不含符号和小数点。 char *ec

    Linux C 函数参考.zip

    gcvt(将浮点型数转换为字符串,取四舍五入) strtod(将字符串转换成浮点数) strtol(将字符串转换成长整型数) strtoul(将字符串转换成无符号长整型数) toascii(将整型数转换成合法的ASCII码字符) tolower(将...

    C库函数(字符串转换篇)

    gcvt 将浮点型数转换为字符串,取四舍五入 strtod 将字符串转换成长整型数 strtol 将字符串转换成长整型数 strtoul 字符串转换成无符号长整型数 toascii 整型数转换成合法的ASCII 码字符 tolower:大写字母转换成...

    proe自定义关系函数,能显示小数点,有源码

    proe自定义关系函数,能显示小数点,有源码,已经生成DLL。自带的itos无法显示小数点,使用时用gcvt(XX)代替itos(XX)就成。虽说不复杂,小弟手头紧,1分只是辛苦分,嘿嘿。

Global site tag (gtag.js) - Google Analytics