浮点数的理解

一、基础知识

1.1 十进制与二进制的转换

i 十进制整数转二进制

辗转除二方向取余法:把十进制数字辗转除以2直到商为0为止,然后反向(由下往上读)读取余法.

例如:十进制17转换为二进制

17/2 = 8  ... 1
8/2 = 4   ... 0
4/2 = 2   ... 0
2/2 = 1   ... 0
1/2 = 0   ... 1

把得到的余数由下往上读,十进制17的二进制表示形式为 10001

ii 十进制小数转二进制

十进制的小数乘以2,取乘积的整数部分作为二进制的一位,乘积的剩余小数继续乘以2,直至不存在剩余小数为止。
即:十进制的小数乘以2,记录下乘积的整数部分,接着判断乘积是否含有小数,若含有小数,把小数部分继续乘以2,在积累下乘积的整数部分,直到乘积是整数为止。

例如:十进制0.25可以转换为二进制

0.25 x 2 = 0.5  0

0.5 x 2 = 1     1

故十进制0.25 的二进制表示形式 01

例如:十进制0.2可以转换为二进制

0.2 x 2 = 0.4 	0

0.4 x 2 = 0.8   0

0.8 x 2 = 1.6   1

0.6 x 2 = 1.2   1

0.2 x 2 = 0.4   0

0.4 x 2 = 0.8   0

0.8 x 2 = 1.6   1
.........(乘积永远也得不到整数)

故十进制0.2 的二进制表示形式 0011001....,这也是浮点数在计算机中存储会出现精度丢失的原因。

1.2 科学记数法

科学记数法是一种记数的方法。把一个数表示成a与10的n次幂相乘的形式(1≤|a|<10,a不为分数形式,n为整数),这种记数法叫做科学记数法。

例如:19971400000000=1.99714×10^13。计算器或电脑表达10的幂是一般是用E或e,也就是1.99714E13=19971400000000。

1.3 计算机中的浮点数科学记数法

浮点数:顾名思义是指 小数点可以任意浮动的数字。

浮点数和整数有所不同,那么在计算机中,是如何存储浮点数的呢?

我们引入科学记数法的概念:科学记数法是指把一个数字表示成a与10的n次幂相乘的形式。在我们用科学记数法记录较大的或较小的数字时,可以大大减少记录数字所需要的空间和时间。

在计算机中,浮点数的存储方式与科学记数法很相似,它把一个数字表示成了a与2的n次幂相乘的形式

如:
		8.25  
		换算成二进制 (方法是:整数部分除二取余,小数部分乘二取整)
		8 -> 1000
		0.25 -> 01
		
		8.25  的二进制是 1000.01
		
		再用科学计算法表示
		1.00001 * 2^3
		
		任何小数都可以用 1.xxxx * 2^n表示
		
		1和小数点和指数2都是一样,xxxxx(尾数部分) 和n(指数部分)不一样的
		
			所以计算机中存  符号位 ,尾数部分,指数部分就可以了

二、C语言的浮点数

2.1 浮点数表示方法

  1. 一般表示法
    在这里插入图片描述
  2. 指数表示法
    在这里插入图片描述
  3. 十六进制指数表示法

2.2 浮点数的存储方式

计算机中的浮点数的存储方式遵循IEEE 754标准,存储格式分为三部分:符号部分、尾数部分(0.1 <= 尾数 < 1)和指数部分。

IEEE 754标准

IEEE 754标准采用的浮点数的格式:
在这里插入图片描述
ms为符号位,表示浮点数的符号。(1为负数,0为正数)
E为指数部分,需加上127偏移量。
M是尾数部分,尾数指小数点后面的部分。注意:在对阶规格化后,因为小数点前面的整数部分必须为1,所以IEEE754标准不会存储这个1,即指存小数点后的数值)

IEEE 754标准规定常用的浮点数格式有短浮点数(单精度、float)、长浮点数(双精度、double型)、临时浮点数。

短浮点数数符占1位;阶码占8位,以2为底,用移码表示,阶码偏置值为127(阶码全1表示无限大,E的范围是1~254,空出全0表示非规格化数);尾数部分为23位。
在这里插入图片描述

长浮点数数符占1位;阶码占11位,以2为底,用移码表示,阶码偏置值为1023(阶码全1表示无限大,E的范围是1~2046,空出全0表示非规格化数);尾数部分为52位。
在这里插入图片描述

2.3 举例子

i 正指数

十进制单精度浮点数8.25的二进制表示是怎么样的呢?如下

我们由上可知,十进制8.25在计算机中的科学记数法的表示形式是:1.00001 * 2^3
符号部分为0,指数部分为3 + 127,尾数部分为00001

float num = 8.25;

				符号位		指数部分		尾数部分
	float类型 	1bit		 8bit		 23bit
			
		8.25    0			 3			 00001
		
		符号位 :1为负数,0为正数
		指数部分: 3+127		1000 0010
		尾数部分 00001 低位补0   00001 000000000...00000
			
		8.25  在计算机中存储的形式是 : 0 1000 0010 00001.......000000

在这里插入图片描述

ii 负指数

十进制单精度浮点数0.2的二进制表示是怎么样的呢?

首先将十进制数0.2转换为二进制数:

0.2*2 = 0.4 	...0
0.4*2 = 0.8 	...0
0.8*2 = 1.6 	...1
0.6*2 = 1.2 	...1
0.2*2 = 0.4	 	...0
0.4*2 = 0.8 	...0
0.8*2 = 1.6 	...1
.......(loop)

由上,得到十进制数0.2的二进制数为 0.00110011001.... = 1.10011001....*2^(-3)

十进制2.25在计算机中的科学记数法的表示形式是:1.10011001 * 2^(-3)
符号部分为0,指数部分为-3 + 127,尾数部分为10011001...

float num = 0.2;

				符号位		指数部分		尾数部分
	float类型 	1bit		 8bit		 23bit
			
		0.2     0			-3			10011001...
		
		符号位 :0
		指数部分: -3+127		0111 1100
		尾数部分 10011001...无限循环    10011001100110011001100
			
		0.2  在计算机中存储的形式是 : 0 0111 1100 10011001100110011001100

在这里插入图片描述
这里不知道为什么转换器中尾数的最后一位为1,可能是四舍五入吧。

大家可以通过转换工具验证其他浮点数的转换结果:IEEE754浮点数二进制转换工具

浮点数的大小范围

单精度类型float
阶码的范围是 -126~128, 这个是IEEE-754标准中定义的

我们可以通过明示常量获取。

#include<stdio.h>
#include <float.h>

int main()
{
	printf("float limit min:%e,max:%e\n",FLT_MIN,FLT_MAX);
	return 0;
}

所以floa单精度类型的浮点数t最小值为 2-126 = 1.175494E-38,最大值为2128 = 3.4028E38

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值