⼗进制浮点数转换成IEEE754标准的32浮点数的⼆进制格式
参考:
-------------------------------------------------------------------------------
我两年前就知道不应该⽤==号来判断浮点数的相等了,因为存在⼀个精度的问题,但是⼀直以来,都没怎么在乎这些东西,⽽实际上,我对于浮点数的结构,虽然了解,但并不清晰. 作为⼀个C++爱好者,应该尽量搞清楚每⼀个问题,所以我搞清楚了浮点数的内在表⽰及实现.在没有⼤问题的情况下,⼀切以易于理解和记忆为标准.
⾸先说⼀下原,反,补,移码. 移码其实就等于补码,只是符号相反. 对于正数⽽⾔,原,反,补码都⼀样, 对负数⽽⾔,反码除符号位外,在原码的基础上按位取反,补码则在反码的基础之上,在其最低位上加1,要求移码时,仍然是先求补码,再改符号.
浮点数分为float和double,分别占4,8个字节,即32,64位. 我仅以32位的float为例,并附带说double.
在IEEE754标准中,规定,float的32位这样分:
符号位(S)
1阶码(E)
8尾数(M) 23
这⾥应该注意三点: A,阶码是⽤移码表⽰的,这⾥会有⼀个127的偏移量,它的127相当于0,⼩于127时为负,⼤于127时为正,⽐如:10000001表⽰指数为129-127=2,表⽰真值为2^2,⽽01111110则表⽰2^(-1).
B, 尾数全都是⼩数点后⾯的数,
C, 但尾数中省略了⼀个1,因此尾数全为0时,也是00;
接下来只要说明⼏个问题就明⽩了,以123.456为例,表⽰为⼆进制就是:N (2) = 1111011. 01110100101111001 ,这⾥,会右移6位,得到N (2) = 1.111011 01110100101111001*2^6; 这种形式就可以⽤于上图中的表⽰格式了.
符号位(S)
0 阶码(E)支持小数点的进制转换器
00000110
尾数(M)
11101101110100101111001
注意到,上⾯的阶码第⼀位为0表正,尾数⽐N(2)表⽰的第⼀位少了个1,这就是上⾯说的默认为第⼀位为1. 由于在将⼗进制转为⼆进制的过程中,常常不能正好转得相等, (当然,像4.0这样的就不会有损失,⽽1.0/3.0这样的必然损失),所以就产⽣了浮点数的精度问题, 实际上,⼩数点后的23位⼆进制数,能影响的⼗进制数的前8位,这是为什么呢?⼀般⼈在这时往往迷迷胡胡了,其实很简单,在上⾯表⽰的尾数中,是⼆进制的,⼩数点后有23位,最后⼀位的值为1时,它就是1/2^22=0.000000238实际取的时候肯定是0.0000002,也就是说,对于⼀个float型的浮点数,其有效的位数是从左到右数7位(包括缺省的1才是7位),当到达上⾯这个第8位时,就不可靠了,但我们的VC6可以输出最长的1.0/3.0为0.33333333333333331,这主要是编译器的问题了, ⽽并不是说浮点数⼩数点后的16位都有效. 如果不信的话,可以去试⼀下double类型的1.0/3.0, 得到的也将是⼩数点后17位.
--------------------------------------
将20.163转换成754标准的32位浮点数
1.将⼗进制数转换成⼆进制数
⼗进制浮点数,整数部分转换成⼆进制,采⽤除2取余法,将余数从低到⾼排列,即为整数的⼆进制数;
⼩数部分转换成⼆进制,采⽤乘2取整法,将取整数顺序排列,即为⼩数的⼆进制数。
⼩数部分乘2直到⼩数部分为0,或取到想要的位数,或循环出现前。
整数部分
20/2=10 0
10/2=5 0
5/2=2 (1)
2/2=1 0
1/2=0 (1)
⼩数部分
0.163*2=0.326 0
0.326*2=0.652 0
0.652*2=1.304 1
0.304*2=0.608 0
0.608*2=1.216 1
0.216*2=0.432 0
0.432*2=0.864 0
0.864*2=1.728 1
0.728*2=1.456 1
0.456*2=0.912 0
不要求精度时,通常取到8~10位
20.163=10100.0010100110
2.移动⼩数点到第1、2位之间,得e的值
10100.0010100110=1.01000010100110 *2的4次⽅ e=4(⼩数点移动4位)3.求出S、E、M的值
S=0,E=4+127=131,M=01000010100110
S由⼩数点的后⼀位可以看出,0为正数,1为负数。
0 1000001 01000010100110000000000
IEEE754标准中32位浮点数表⽰
S E M
S是符号位占1位,E是阶码占8位,M是尾数占23位。
当尾数的值不为0时,尾数的最⾼有效位应为1,这称为浮点数的规格化表⽰这样形式的叫规格化
新⼿初学,有问题或者错误,⿇烦评论下留⾔指正,谢谢
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论