概述
三十二位机器下浮点型是32位,六十四位机器下浮点类型是64位。
1)以平常使用的单精度浮点型为例,其存储分为3块。
第一块符号位sign,由第一位来表示,1为负数,0为非负。
第二块指数位exp,由8个二进制来表示,其存储的是二进制的指数值(二进制数化成正数位为1的指数形式,这种方式叫做隐含的以1开头的表示)加上偏移,单精度的偏移是127。
第三块是位数位frac,由23个位构成,表示的是二进制数第一个1以后的二进制串。
2)浮点型的存储因指数位的不同,分为规格化的,非规格化的和无穷大,非数四种情况组成。
a.规格化的:exp!=0 && exp !=255,即指数位不全为零,也不全为1时的情况。此时存储的指数位是加上偏移127。其位数二进制表示为0 <= frac < 1,其位数实际为M = frac + 1;
b.非规格化的:exp = 0,存储的指数位是E = 1 - 127,其位数位为M = frac,不再包含隐含的开头1。
c.无穷大:exp = 255,frac = 0,当sign = 0时是正无穷,当sign = 1时是负无穷。
d.NaN(not a number):exp = 255,frac != 0;比如根号下负一的值。
例如:float f=0; 即f的存储全为零。当符号位为1的时候为-0;
双精度浮点型的一些参数:双精度的指数位由十位二进制构成,其偏移是1023,其尾数位为53位。
float型浮点数的取值范围:1.20e-38(2*2^)-----3.40e+38(2*2^).
double型浮点数取值范围:2.2e-308(2*2^)------1.8e+308(2*2^).
取出计算机中的浮点型数据:
void float_spa(float f)
{
int d = *(int *)&f; //将浮点型的存储形式用整型表现出来
int sign = (0x80000000 & d) >> 31; //将符号位取出来
int exp = ((0x7f800000 & d) >> (32 - 9)) - 127; //取出指数位
//其中特别注意exp为0和
int frac = ((0x007fffff & d) | 0x00800000) >> (23-exp);
}
了解浮点型的存储格式,并且掌握位运算和移位操作。
将浮点型中的各部分通过位运算和移位操作按块出来,首先确定函数的符号,其次拿出指数位,减去偏移,得出尾数位中需要向右偏移多少位是整数部分,其中有一个1在进行浮点数存储的时候隐藏了需要补上。然后输出整型乘以符号得到整型形式。
指数位全为零和指数位全为一的存储与普通浮点数存储的形式在偏移计算中略有不同。将其三种不同详细介绍
最后
以上就是正直店员为你收集整理的C语言的浮点型数值的全部内容,希望文章能够帮你解决C语言的浮点型数值所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复