详解浮点型在内存中的存储

浮点型详解

浮点数家族包括float,double,long double类型

浮点数表示的范围定义在头文件float.h。

一、浮点数的有效位数

1、含义:浮点数能精确表达的十进制数中的小数的位数
float的有效位数是6~7位
double的有效位数是15位
实际上十进制浮点数最多有8位的有效数字,但是有些8位数字超出float能表示的范围。因此它可以确保7位是有效数字。
这就是浮点数并不是能精确地表示所有的小数的原因。
正确使用浮点数的注意事项:1、比较两个浮点数是否相等,尽量不能直接使用==(全等号) 2、 尽量不要使用float,而是使用double 3、另外在金融领域,一定要使用BigDecimal类,可以保证不会有精度缺失。

二、浮点型的存储原理

单精度浮点数又称32位浮点数,在内存中要占用32个比特位。而32个比特位被划分为3个部分。从高位到低位排列,分别被划分为:符号位、指数位、尾数位。理解浮点数的存储原理本质上就是要理解浮点数在计算机内部的表示方法。

IEEE754规定任意一个二进制浮点数F都可以表示成下述形式:

(-1) S * M * 2 E

详解:(-1)S 表示符号位,当S=0时,F为正数;S = 1时,F为负数

​ M表示有效数字(二进制浮点数后移小数点的数字)。M大于等于1且小于2

举个例子:十进制数10.75,写成二进制数是1010.11,相当是1* (1.01011) * 23 (3代表小数点左移的位数)。

此时按照上面的格式,可以得出S为0,M为1.01011,E为3。

1、符号位S

符号位:用来表示这个数是正数还是负数 。0表示正数,1表示负数。在32个比特位中只占一个比特位并且是最高位。

2、尾数位M

M为二进制浮点数后移小数点至最高位与第二高位之间。十进制浮点数10.75写成二进制浮点数是1010.11,那么将二进制浮点数的小数点移动,此时所得结果是1.01011即为M。

IEEE754规定 :1 <= M < 2

对于float:尾数位M在内存中最多使用23个比特位来存储。
对于double:尾数位M在内存中最多使用52个比特位来存储。

M的最高位肯定是1,为了增加精度,在存储时,最高位总是为1则可以省略最高位,只存储小数点后的数字。所以说将第一位舍去后,尾数位最多可以存储24位。
注意:在存储二进制时隐藏最高位与小数点,并在尾数值(规范化后,括号里的数值)后补零

3、偏移指数位E

IEEE规定:E是一个无符号整数即unsigned int.

a. 指数位的存储

IEEE754规定,存入内存时E的真实值必须加上一个偏移量。对于8位的E,偏移量是127;对于11位的E是,偏移量是1023。还是上述10.75的例子,E的真实值是3 + 127 = 130即在计算机中的存储的是1000 0010

b.指数位的读取

指数位从内存中读取可以分为三种情况:

  1. E不全为0或不全为1
    将存储在浮点数中的占用8个比特位的二进制数转换为十进制数,然后再减去十进制数127(或者是1023)得到一个十进制数即为真实值。

  2. E全为零
    这时浮点数的指数E等于1 - 127(或者1 - 1023)所得结果即为真实值。有效数字M不再加上第一位的1,而是默认为0.xxx的小数。原因:为了表示 ± \pm ± 0, 以及接近于0的很小的数字。

  3. E全为1
    如果有效数字M全为0,表示 ± \pm ± 无穷大(正负取决符号位S)。

三、实例

接下来,举个例子深刻理解上述理论。

float f = 10.25f;

按(-1)S * M * 2 E 转换为(1.01011) * 23 。此时,S = 0, M = 1.01011, E = 3 + 127 = 130

浮点数在计算机内存中的二进制数是:0 10000010 01011000000000000000000

写在最后:本人编程初入门,若上述讲解有误,请各位多多指正。

你可能感兴趣的:(初识C语言,c语言)