C语言学习之浮点型数据存储

C语言学习之浮点型数据

浮点数

浮点型数据分为单精度浮点型(float)和双精度浮点型(double).
单精度(float)
单精度浮点值
取值范围:1.2E-38 到 3.4E+38
精度:6 位小数
单精度浮点值。单精度是这样的格式,1位符号,8位指数,23位小数。
在这里插入图片描述
上述图片是计算机将float型数据存储的形式描述。
双精度浮点值
取值范围:2.3E-308 到 1.7E+308
精度: 15 位小数
双精度是1位符号,11位指数,52位小数。
C语言学习之浮点型数据存储_第1张图片
上述图片是计算机将float型数据存储的形式描述。
具体的存储原理以单精度浮点数为例
二进制的存储形式,
首位是符号位,0代表正数,1代表负数。
23~30位为指数位,
0~22位为小数位

下面关于指数位进行详细介绍

指数位也称为阶码。
阶码:在机器中表示一个浮点数时需要给出指数,这个指数用整数形式表示,这个整数叫做阶码。
阶码位数越多,可表示的数的范围越大;尾数越多,所表示的数的精度越高。
3.375为例,3的二进制为011,0.375的二进制为011,那么3.375的二进制可以写成11.011,用科学计数法的形式写,就是1.1011x10,即 指数位是1;同理 120.25的二进制形式为1111000.01,用科学计数法的形式写就是1.11100001x10^(+6),即指数位是+6,在指数位有+6,那么就有-6,又因为指数位一个有8位,范围是-127~128,
为了消除负数对指数的影响,就增加了一个偏移量的概念,在float中偏移量为127,这样就是所有的数均大于等于0了,那么偏移后,指数的范围是0~255.
例如 1+127=128,其转化为二进制形式为10000000
6+127=133,其转化为二进制形式为10000101

     那么最终上述的两个例子在计算机中的存储结果为
     1  10000000  10110000000000000000000   -----3.375
     1  10000101  11100001000000000000000   ------120.25

细心观察的话就发现,科学技术法表示的整数位上的1 并未写入上述的存储结果之中,这是因为1肯定始终确定的,那么就省略了,这样做相当于省了1bite空间表示,可以认为是提高了精确度。
下面是将十进制数转化为二进制数的程序

//将十进制小数分别求其整数的二进制、小数的二进制,并分别输出
#include
#include
int fun(int n)
{
	if (n){
		fun(n / 2);
		printf("%d", n & 1);
	}
	if (n==0)
	printf("%d", n & 1);
}
int fun1(float f)
{
	int flat = 1;
	int number = 0;
	while (flat)
	{
		int num;//用来存储f的整数部分
		f = f * 2;
		num = (int)f;
		f = f - num;
		printf("%d", num);
		number++;
		if (f == 0)
			flat = 0;
	}
}
int main()
{
	float ff = 120.25;//以一个实际小数为例
	int Num;
	if (ff > 1)
	{
		Num = (int)ff;//求小数的整数部分
		ff = ff - Num;//求小数的小数部分
	}
	else
	{
		Num = 0;
	}
	fun(Num);
	printf("\n");
	fun1(ff);
	printf("\n");
}

将十进制小数部分转化为二进制的基本原理的C语言核心代码

int fun1(float f)
{
	int flat = 1;
	int number = 0;
	while (flat)
	{
		int num;//用来存储f的整数部分
		f = f * 2;
		num = (int)f;
		f = f - num;
		printf("%d", num);
		number++;
		if (f == 0)
			flat = 0;
	}
}

关于double型数据的存储过程本质上类似,但是由于其存储大小为8个字节,因此其指数位的偏移量是1023,除此之外,没什么不同,当然了,0也比较多。
除了float double型数据,还有long double 型数据,其存储大小为16字节,取值范围为3.4E-4932 到 1.1E+4932,精度为19 位小数。
本篇博客参考了一下一篇文档
C语言浮点数存储方式(其中含有较多的图片,更利于理解吧)

你可能感兴趣的:(C语言学习之浮点型数据存储)