1 前言
我们在学习C语言的时候,通常认为浮点数和小数是等价的,并没有严格区分它们的概念,这并不影响我们的学习,因为浮点数和小数是绑定在一起的,只有小数以浮点格式存储。
其实整数和小数都可以用定点格式存储,或者都可以用浮点格式存储,但实际情况是C语言用定点格式存储整数和浮点格式存储小数。追求“数值范围”和“数值精度”两个重要指标平衡的结果。
2 什么是浮点数?
浮点仅表示实数。浮点数在计算机中用于逼近任何实数。具体来说,这个实数是通过将整数或定点数(即尾数)乘以底数(在计算机中通常是 2) 的整数幂,类似于以 10 为底的科学记数法)定律获得的。
3 浮点数在内存中的存储
首先要明确的是,整型、浮点型或字符等数据类型都是以二进制形式存储在计算机底部的。
浮点数在内存中的存储方式与整数不同c语言浮点数表示方法,因为整数可以转换为一对一的二进制数据。浮点数的存储由符号位(sign)+指数位(exponent)+小数位(fraction)组成。
输入符号位指数尾数
浮动
第 1 位(第 31 号)
8位(23~30位)
23位(0~22位)
双
位 1(位 63)
11位(52~62位)
52位(0~51位)
int和float同样占用四个字节的内存,但是float所能表示的最大值要比int大很多。根本原因是浮点数以指数方式存储在内存中。
浮点数转换为内存存储的步骤分为以下三个步骤:
对于第3点:计算指数的时候需要加上偏移量(后面我们会介绍为什么要使用偏移量),而偏移量的值与浮点数的类型有关(偏移量的值float 为 127,double 的偏移值为 1023)。例如,对于指数 6,float 和 double 类型的偏移值为:
4 个例子
浮点数19.625如何存储在float中:
5 个浮点和双精度范围和精度范围
float 和 double 的范围由指数中的位数决定。 (因为表示是1.x * 2^Y的形式,所以忽略1.x的影响,直接用指数来表示浮点数的范围)
1bit(符号位)8bits(指数位)23bits(尾数位)
1bit(符号位)11bits(指数位)52bits(尾数位)
所以c语言浮点数表示方法,float的指数范围是-127~+128,而double的指数范围是-1023~+1024,指数位以补码的形式除。
负指数决定了浮点数可以表示的绝对值最小的非零数;而正指数则决定了浮点数所能表达的绝对值最大的数,即决定了浮点数的取值范围。
float的范围是-2^128 ~ +2^128,即-3.40E+38 ~ +3.40E+38;
double的范围是-2^1024 ~ +2^1024,即-1.79E+308 ~ +1.79E+308。
准确度
float 和 double 的精度由尾数的位数决定。尾数越多,可以表示的小数点后的有效数字越多,因此精度越高。浮点数按照科学记数法存储在内存中,整数部分总是隐含的“1”。由于它是不可变的,因此不会影响精度。
float: 2^23 = 8388608,一共七位,也就是说最多可以有7位有效位,但是绝对保证6位,即float的精度为6~7位有效位;
p>
double:2^52 = 4503599627370496,共16位。同理,double 的精度为 15~16 位。
6 解剖学:为什么要使用偏移量来计算指数?如果不使用偏移方法:
8位二进制数表示的有符号数的范围有0000 0000~0111 1111和1000 0000~1111 1111两个范围,分别为0~+127和-127~0。
你看这里的问题,有两个0,一个正0,一个负0。
如果使用偏移方法:
127转换成二进制是:0111 1111
然后
当我们要表示 128 时,则有 128+127 或 1000 0000 + 0111 1111 = 1111 1111
从上面的例子中,我们可以得出规律。使用移位存储技术,我们可以用 8 位二进制来表示一共 127 个负数 + 零从 -127~+128(0)+ 128 个正数)一共 256 个数。使用移位存储似乎没有+0和-0的问题,并且可以充分利用新生成的8位二进制数最大程度地表示单精度浮点数的幂指数,即很合理。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 欧资源网