看不懂c语言浮点型中的内存分配和双精度浮点型(double),求大神指点

C语言中单精度和双精度浮点型数据的有效数值怎么算出来的?_百度知道
C语言中单精度和双精度浮点型数据的有效数值怎么算出来的?
这个最好去看一下计算机组成,里面讲到float数的表示方法,比如float数,计算机里面的存储形式是32位,第一位是符号位,第2~9这8位是2的N次方中的N,也就是阶码,阶码范围:±127,单精度阶码:决定浮点数的数值范围。float绝对值最大最小:2^(±127)≈10^(±38)双精度阶码:决定浮点数的数值范围。double绝对值最大最小:2^(±1023)≈10^(±306)
来自团队:
其他类似问题
为您推荐:
您可能关注的推广
浮点型的相关知识
其他2条回答
2的N次方减1就是了
补充一下推荐答案中2^
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁C语言单精度与双精度的区别?_百度知道
C语言单精度与双精度的区别?
其实就是有效位数不一样。浮点型变量分为单精度(float)、双精度(double)和长双精度(long double)3类。在Turbo C 中:
比特(位)数
15-16long double 128
18-19ANSI C 并未具体规定每种类型数据的长度、精度、数值范围,有的系统将double所增加的32位全用于存放小数部分,这样可以增加数值的有效范围,减少舍入误差。有的系统则将所增加的位(bit)一部分存放指数部分,这样可以扩大数值范围
其他类似问题
为您推荐:
单精度实型 float 占4个字节 能保证6位有效数字,取值范围为-3.4*10的-38次方至3.4*10的38次方。 双精度实型 double 占8个字节 能保证15位有效数字,取值范围为-1.7*10的-308次方至1.7*10的308次方
C中没有单精度的说法,一般就叫浮点型float。双精度是double,这两个的区别是在WIN32和LINUX下,float类型占4字节,double类型占8字节,因为double占8字节,自然双精度的有效数据位比float类型多,更精确
占用内存空间不一样,单精度4字节,双8……
精度不一样
位数不一样啊
单精度的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁#define&MON&&1
#define&TUE&& 2
#define&WED&&3
#define&THU&& 4
#define&FRI&&& 5
#define&SAT&& 6
#define&SUN&& 7
在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。
1. 定义一种新的数据类型 - 枚举型
&以下代码定义了这种新的数据类型 - 枚举型
&&&&&&MON=<span style="color: #,&TUE,&WED,&THU,&FRI,&SAT,&SUN
(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。
(2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。
(3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。
(4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。
(5) 枚举型是预处理指令#define的替代。
(6) 类型定义以分号;结束。
2. 使用枚举类型对变量进行声明
新的数据类型定义完成后,它就可以使用了。我们已经见过最基本的数据类型,如:整型int, 单精度浮点型float, 双精度浮点型double, 字符型char, 短整型short等等。用这些基本数据类型声明变量通常是这样:
char&&&&&//变量a的类型均为字符型char
int&&&&&&& x,
&&&&&&&&&& y,
&&&&&&&&&&&//变量x,y和z的类型均为整型int
double& m,&n;
double&&//变量result的类型为双精度浮点型double
既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。
方法一:枚举类型的定义和变量的声明分开
&&&&&&MON=<span style="color: #,&TUE,&WED,&THU,&FRI,&SAT,&SUN
enum&DAY&&//变量tomorrow的类型为枚举型enum&DAY
enum&DAY&good_day,&bad_&//变量good_day和bad_day的类型均为枚举型enum&DAY
方法二:类型定义与变量声明同时进行:
enum&//跟第一个定义不同的是,此处的标号DAY省略,这是允许的。
&&&&saturday,
&&&&sunday&=&<span style="color: #,
&&&&monday,
&&&&tuesday,
&&&&wednesday,
&&&&thursday,
&&&&friday
}&&//变量workday的类型为枚举型enum&DAY
enum&week&{&Mon=<span style="color: #,&Tue,&Wed,&Thu,&Fri&Sat,&Sun}&&//变量days的类型为枚举型enum&week
enum&BOOLEAN&{&false,&true&}&end_flag,&match_&//定义枚举类型并声明了两个枚举型变量
方法三:用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明:
typedef&enum&workday
&&&&saturday,
&&&&sunday&=&<span style="color: #,
&&&&monday,
&&&&tuesday,
&&&&wednesday,
&&&&thursday,
&&&&friday
}&&//此处的workday为枚举型enum&workday的别名
workday&today,&&//变量today和tomorrow的类型为枚举型workday,也即enum&workday
enum workday中的workday可以省略:
typedef&enum
&&&&saturday,
&&&&sunday&=&<span style="color: #,
&&&&monday,
&&&&tuesday,
&&&&wednesday,
&&&&thursday,
&&&&friday
}&&//此处的workday为枚举型enum&workday的别名
workday&today,&&//变量today和tomorrow的类型为枚举型workday,也即enum&workday
也可以用这种方式:
typedef&enum&workday
&&&&saturday,
&&&&sunday&=&<span style="color: #,
&&&&monday,
&&&&tuesday,
&&&&wednesday,
&&&&thursday,
&&&&friday
workday&today,&&//变量today和tomorrow的类型为枚举型workday,也即enum&workday
注意:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量。错误示例如下所示:
错误声明一:存在同名的枚举类型
typedef&enum
&&&&wednesday,
&&&&thursday,
&&&&friday
}&workday;
typedef&enum&WEEK
&&&&saturday,
&&&&sunday&=&<span style="color: #,
&&&&monday,
}&workday;
错误声明二:存在同名的枚举成员
typedef&enum
&&&&wednesday,
&&&&thursday,
&&&&friday
}&workday_1;
typedef&enum&WEEK
&&&&wednesday,
&&&&sunday&=&<span style="color: #,
&&&&monday,
}&workday_2;
3. 使用枚举类型的变量
3.1 对枚举型的变量赋值。
实例将枚举类型的赋值与基本数据类型的赋值进行了对比:
方法一:先声明变量,再对变量赋值
#include&stdio.h&
/*&定义枚举类型&*/
enum&DAY&{&MON=<span style="color: #,&TUE,&WED,&THU,&FRI,&SAT,&SUN&};
void&main()
&&&&/*&使用基本数据类型声明变量,然后对变量赋值&*/
&&&&int&x,&y,&z;
&&&&x&=&<span style="color: #;
&&&&y&=&<span style="color: #;
&&&&z&=&<span style="color: #;
&&&&/*&使用枚举类型声明变量,再对枚举型变量赋值&*/
&&&&enum&DAY&yesterday,&today,&
&&&&yesterday&=&MON;
&&&&today&&&&&=&TUE;
&&&&tomorrow&&=&WED;
&&&&printf("%d&%d&%d&\n",&yesterday,&today,&tomorrow);
方法二:声明变量的同时赋初值
#include &stdio.h&
/*&定义枚举类型&*/
enum&DAY&{&MON=<span style="color: #,&TUE,&WED,&THU,&FRI,&SAT,&SUN&};
void&main()
&&&&/*&使用基本数据类型声明变量同时对变量赋初值&*/
&&&&int&x=<span style="color: #,&y=<span style="color: #,&z=<span style="color: #;
&&&&/*&使用枚举类型声明变量同时对枚举型变量赋初值&*/
&&&&enum&DAY&yesterday&=&MON,&
&&&&&&&&&&&&&&&&&&&&&& &today&=&TUE,
&&&&&&&&&&&&&&&&&& tomorrow&=&WED;
&&&&printf("%d&%d&%d&\n",&yesterday,&today,&tomorrow);
方法三:定义类型的同时声明变量,然后对变量赋值。
#include&&stdio.h&
/*&定义枚举类型,同时声明该类型的三个变量,它们都为全局变量&*/
enum&DAY&{&MON=<span style="color: #,&TUE,&WED,&THU,&FRI,&SAT,&SUN&}&yesterday,&today,&
/*&定义三个具有基本数据类型的变量,它们都为全局变量&*/
int&x,&y,&z;
void&main()
&&&&/*&对基本数据类型的变量赋值&*/
&&&&x&=&<span style="color: #;&&y&=&<span style="color: #;&&z&=&<span style="color: #;
&&&&/*&对枚举型的变量赋值&*/
&&&&yesterday&=&MON;
&&&&today&&&&&=&TUE;
&&&&tomorrow&&=&WED;
&&&&printf("%d&%d&%d&\n",&x,&y,&z);&//输出:10&20&30
&&&&printf("%d&%d&%d&\n",&yesterday,&today,&tomorrow);&//输出:1&2&3
方法四:类型定义,变量声明,赋初值同时进行。
#include&&stdio.h&
/*&定义枚举类型,同时声明该类型的三个变量,并赋初值。它们都为全局变量&*/
&&&&MON=<span style="color: #,&
yesterday&=&MON,&today&=&TUE,&tomorrow&=&WED;
/*&定义三个具有基本数据类型的变量,并赋初值。它们都为全局变量&*/
int&x&=&<span style="color: #,&y&=&<span style="color: #,&z&=&<span style="color: #;
void&main()
&&&&printf("%d&%d&%d&\n",&x,&y,&z);&//输出:10&20&30
&&&&printf("%d&%d&%d&\n",&yesterday,&today,&tomorrow);&//输出:1&2&3
3.2 对枚举型的变量赋整数值时,需要进行类型转换。
#include&&stdio.h&
enum&DAY&{&MON=<span style="color: #,&TUE,&WED,&THU,&FRI,&SAT,&SUN&};
void&main()
&&&&enum&DAY&yesterday,&today,&
&&&&yesterday&=&TUE;
&&&&today&=&(enum&DAY)&(yesterday&+&<span style="color: #);&//类型转换
&&&&tomorrow&=&(enum&DAY)&<span style="color: #;&//类型转换
&&&&//tomorrow&=&3;&//错误
&&&&printf("%d&%d&%d&\n",&yesterday,&today,&tomorrow);&//输出:2&3&30
3.3 使用枚举型变量
#include&stdio.h&
&&&&BELL&&&&&&&&&&=&'\a',
&&&&BACKSPACE&=&'\b',
&&&&HTAB&&&&&&&& =&'\t',
&&&&RETURN&&&& &=&'\r',
&&&&NEWLINE&&& =&'\n',&
&&&&VTAB&&&&&&&& =&'\v',
&&&&SPACE&&&&&& =&'&'
enum&BOOLEAN&{&FALSE&=&<span style="color: #,&TRUE&}&match_
void&main()
&&&&int&index&=&<span style="color: #;
&&&&int&count_of_letter&=&<span style="color: #;
&&&&int&count_of_space&=&<span style="color: #;
&&&&char&str[]&=&"I'm&Ely&efod";
&&&&match_flag&=&FALSE;
&&&&for(;&str[index]&!=&'\0';&index++)
&&&&&&&&if(&SPACE&!=&str[index]&)
&&&&&&&&&&&&count_of_letter++;
&&&&&&&&else
&&&&&&&&&&&&match_flag&=&(enum&BOOLEAN)&<span style="color: #;
&&&&&&&&&&&&count_of_space++;
&&&&printf("%s&%d&times&%c",&match_flag&?&"match"&:&"not&match",&count_of_space,&NEWLINE);
&&&&printf("count&of&letters:&%d&%c%c",&count_of_letter,&NEWLINE,&RETURN);
match 2 times
count of letters: 10
Press any key to continue
4.&枚举类型与sizeof运算符
#include &stdio.h&
enum&escapes
&&&&BELL&&&&&&=&'\a',
&&&&BACKSPACE&=&'\b',
&&&&HTAB&&&&&&=&'\t',
&&&&RETURN&&&&=&'\r',
&&&&NEWLINE&&&=&'\n',&
&&&&VTAB&&&&&&=&'\v',
&&&&SPACE&&&&&=&'&'
enum&BOOLEAN&{&FALSE&=&<span style="color: #,&TRUE&}&match_
void&main()
&&&&printf("%d&bytes&\n",&sizeof(enum&escapes));&//<span style="color: #&bytes
&&&&printf("%d&bytes&\n",&sizeof(escapes));&//<span style="color: #&bytes
&&&&printf("%d&bytes&\n",&sizeof(enum&BOOLEAN));&//<span style="color: #&bytes
&&&&printf("%d&bytes&\n",&sizeof(BOOLEAN));&//<span style="color: #&bytes
&&&&printf("%d&bytes&\n",&sizeof(match_flag));&//<span style="color: #&bytes
&&&&printf("%d&bytes&\n",&sizeof(SPACE));&//<span style="color: #&bytes
&&&&printf("%d&bytes&\n",&sizeof(NEWLINE));&//<span style="color: #&bytes
&&&&printf("%d&bytes&\n",&sizeof(FALSE));&//<span style="color: #&bytes
&&&&printf("%d&bytes&\n",&sizeof(<span style="color: #));&//<span style="color: #&bytes
5.&综合举例
#include&stdio.h&
enum&Season
&&&&spring,&summer=<span style="color: #0,&fall=<span style="color: #,&winter
typedef&enum
&&&&Monday,&Tuesday,&Wednesday,&Thursday,&Friday,&Saturday,&Sunday
void&main()
&&&&/*&Season&*/
&&&&printf("%d&\n",&spring);&//&0
&&&&printf("%d,&%c&\n",&summer,&summer);&//&100,&d
&&&&printf("%d&\n",&fall+winter);&//&193
&&&&Season&mySeason=
&&&&if(winter==mySeason)
&&&&&&&&printf("mySeason&is&winter&\n");&//&mySeason&is&winter
&&&&int&x=<span style="color: #0;
&&&&if(x==summer)
&&&&&&&&printf("x&is&equal&to&summer\n");&//&x&is&equal&to&summer
&&&&printf("%d&bytes\n",&sizeof(spring));&//&4&bytes
&&&&/*&Weekday&*/
&&&&printf("sizeof&Weekday&is:&%d&\n",&sizeof(Weekday));&//sizeof&Weekday&is:&4
&&&&Weekday&today&=&S
&&&&Weekday&
&&&&if(today&==&Monday)
&&&&&&&&tomorrow&=&T
&&&&&&&&tomorrow&=&(Weekday)&(today&+&<span style="color: #);&//remember&to&convert&from&int&to&Weekday浮点型数据_百度百科
浮点型数据
本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来吧!
浮点型数据定义浮点型数据分为 浮点型常量和浮点型变量实型也称为浮点型。也称为实数或者浮点数。在C语言中,实数只采用十进制。它有二种形式: 形式指数形式。
1.十进制数形式
由数码0~ 9和组成。例如:0.0,.25,5.789,0.13,5.0,300.,-267.8230等均为合法的。
2.指数形式
由,加标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其一般形式为a E n (a为十进制数,n为十进制整数)其值为 a*10,n 如: 2.1E5 (等于2.1*10的5次方), 3.7E-2 (等于3.7*10的-2次方) 0.5E7 (等于0.5*10的7次方), -2.8E-2 (等于-2.8*10的-2次方),以下不是合法的实数 345 (无小数点) E7 (标志E之前无数字)  -5 (无阶码标志) 53.-E3 (负号位置不对) 2.7E (无阶码)
标准C允许浮点数使用后缀。后缀为“f”或“F”即表示该数为。如356f和356.是等价的。例2.2说明了这种情况:
void main()
printf(&%f\n%f\n&,356.,356f);
void 指明main不返回任何值 利用printf显示结果 结束
浮点型变量:
实型变量分为两类:型和双精度型,
其类型说明符为float 单精度说明符,double 双精度说明符。在Turbo C中单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。
实型变量说明的格式和书写规则与相同。
例如: float x,y; (x,y为单精度实型量)
double a,b,c; (a,b,c为双精度实型量)
实型常数不分单、双精度,都按双精度double型处理。
标准4字节浮点型在计算机里存储方式如下图
IEEE754标准中浮点数表示格式IEEE规定的浮点数表示法是一种,用符号(正或负)、指数和尾数来表示,底数被确定为2。也就是说浮点数被表示为乘以2的指数次方再带上符号。具体格式如下:
  符号域
指数偏移量
单精度浮点数
8位[30-23]
23位[22-00]
双精度浮点数
11 位[62-52]
52 位[51-00]
下面以单精度浮点数为例来介绍浮点数的三个区域:
符号域:符号域占1位,0表示,1表示负数。指数域:指数域共有8位,可表达的范围为:0~255。为能处理负指数,实际指数位存储在指数域中值减去一个偏移量(单精度为127,双精度为1023)。的偏移量为127,故实际可表达的指数值的范围为-127~128。域:尾数域共有23位。由于规范浮点数的小数点左侧必须为1,所以在保存尾数时,可以省略小数点前面这个1,从而腾出一个二进制位来保存更多的尾数。举例:比如对于数而言,二进制的(对应于的9.625)可以表达为1.001101 ×2^3,所以实际保存在尾数域中的
值为00 0,即去掉小数点左侧的1,并用0 在右侧补齐。
(9)的计算:1001
小数部分(0.625)的计算:
0.625*2=1.25--------1
0.25 *2=0.5 ----------0
0.5 *2=1.0 -----------1
所以用二进制科学表示方式为:1.^3
实数与浮点数之间的变换举例例一:已知一个用16数表示为:0xC0B40000,求此浮点数所表达的实数。
先转换为二进制形式(注意:对于转换成一定要:先取反,后加1)
C 0 B 4 0 0 0 0
按照浮点数格式切割成相应的域 1 101 000000
经分析:符号域1 意味着负数;指数域为129 意味着实际的指数为2 (减去偏差值127);尾数域为01101 意味着实际的二进制尾数为1.01101 (加上隐含的小数点前面的1)。所以,实际的实数为:
= -1.01101 × 2^ 2=- ( 1*2^0 + 1*2^(-2) + 1*2^(-3) + 1*2^(-5) ) × 2^2
= -(1+0.25+0.125+0.03125)*4
= -1.40625*4
例二:将实数-9.625变换为相应的浮点数格式。
1) 求出该实数对应的二进制:,用科学技术法表达为:-1.001101 ×2^3;
2) 因为,符号为1;
3) 指数为3,故指数域的值为3 + 127 = 130,即二进制的;
4) 为1.001101,省略小数点左边的1后为001101,右侧0补齐,补够23位,
最终尾数域为:;
5) 最终结果:1 ,用16表示:0xC11A0000。

我要回帖

更多关于 c语言浮点数运算 的文章

 

随机推荐