【基础知识】浮点数在内存中的存储方式
一、简述
在学习小型PLC中,在使用轴控指令时,对于参数的赋值采用的是浮点数。在赋值运算中,使用如下指令进行赋值,发现从浮点数转化为整型,数字竟然差距如此之大,因此,产生了这究竟是怎么产生的好奇心。
DEMOV E1000.100 D0
DMOV D0 D2'
D0=1000.100
D2=1148847718
因此开始在网上查找资料,终于明白了究竟是什么原因。
二、浮点数的二进制构成
众所周知、任何数据在计算机中都是以二进制的方式存储的。float型变量,在内存中占用32bit位,即4byte内存空间。
浮点数的二进制表达主要有三个部分构成
构成1 |
构成2 |
构成3 |
SIGN(标志部分) |
Exponent(指数部分) |
Mantissa(尾数部分) |
占1bit |
占8bits |
占23bits |
代表的含义为:
构成 |
含义 |
sign(1bit) |
表示浮点数的正负。0代表正数,1代表负数。 |
Exponent(8bits) |
指数部分:类似于科学计数法中的M*10^N,这里是以2为底。 需要注意的是,这里是以2^7-1即127(01111111)代表2^0,转换时需要根据加127做偏移。 |
Mantissa(23bits) |
尾数部分:浮点数具体数值的实际表示 |
三、运算过程
1.整数部分的运算
整数部分为1000,则将1000直接转化为二进制,即:11,1110,1000
2.小数部分运算
小数部分为0.1 ,则0.1转换为二进制,即:.000110011001100110011...(无限循环小数)
小数转换为二进制的步骤为:将小数部分乘2,取整,直至小数部分为0.
0.1 * 2 =0.2 0
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
0.6 * 2 =1.2 1
0.2 * 2 =0.4 0
0.4 * 2 =0.8 0
0.8 * 2 =1.6 1
0.6 * 2 =1.2 1
即:.000110011001100110011...为一个无限循环小数。
3.规范化
现在我们已有了1000.1转化为二进制的数值11,1110,1000.0001,1001,1001,1001,1001,10...。与科学计数法类似,我们需要将该数值规范化,写成M×2^N(1<M<2)。
即1.1111,0100,0000,1100,1100,110...*2^9。
这样就得到了我们想要的规范化数值。
4.内容填充
标志部分:1000.1为正数,该1Bit位为0
指数部分:在第二章中提到,在此有127的偏移,因此将9+127=136 ,即1000,1000,该8bits位,填入1000,1000
尾数部分:除了正常的填入外,整数部分的1一律省去(因为所有的数这里都是1)。因此该23bits填充为1111,0100,0000,1100,1100,110
这样就得到了我们想要的32位二进制数:0100,0100,0111,1010,0000,0110,0110,0110,转化为十进制,即:1148847718
四、总结
浮点数和整型数的存储方式是不同的,在使用时需要注意相关的转换。不然很容易出现大的问题。