十进制浮点数转换成IEEE754标准的32浮点数的二进制格式

参考:

http://jimmygod.blog.163.com/blog/static/43511339200792605627411/

http://blog.csdn.net/archersaber39/article/details/51422602

-------------------------------------------------------------------------------

我两年前就知道不应该用==号来判断浮点数的相等了,因为存在一个精度的问题,但是一直以来,都没怎么在乎这些东西,而实际上,我对于浮点数的结构,虽然了解,但并不清晰. 作为一个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时,也是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,这称为浮点数的规格化表示

这样形式的叫规格化

新手初学,有问题或者错误,麻烦评论下 留言指正,谢谢

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 很抱歉,作为AI语言模型,我无法直接进行计算和转换。但是,我可以告诉你如何将一个十进制数表示成IEEE754标准32位浮点规格化数。 IEEE754标准32浮点数由三个部分组成:符号位、指数位和尾数位。其中,符号位用来表示数的正负性,指数位用来表示数的大小,尾数位用来表示数的精度。 具体地,将一个十进制数表示成IEEE754标准32位浮点规格化数的步骤如下: 1. 确定符号位:如果数为正,则符号位为;如果数为负,则符号位为1。 2. 将数的绝对值转换成二进制数。 3. 将二进制数规格化,即将小数点移动到第一个非零位前面,并记录移动的位数。 4. 计算指数位:指数位等于移动的位数加上一个固定的偏移量(127)的二进制表示。 5. 计算尾数位:将规格化后的二进制数的小数部分乘以2的23次方,并将结果转换成二进制数。 6. 将符号位、指数位和尾数位拼接起来,得到IEEE754标准32浮点数。 希望这些信息能对你有所帮助。 ### 回答2: IEEE 754标准是一个指定了浮点数在计算机中的表示方法的标准。在IEEE 754标准中,浮点数32二进制数来表示,其中第一位是符号位,接下来8位是指数,剩下的23位是尾数。以下是将十进制数表示成IEEE 754标准32位浮点规格化数的方法: 1.将十进制数转化为二进制数。例如,如果要将3.14表示为32二进制数,则需要将3和0.14分别转化为二进制数。 3的二进制数为11,0.14的二进制数可以用乘2取整法来求得:0.14*2=0.28,取整得0,再将0.28乘2,得到0.56,取整得1,继续将0.56乘2,得到1.12,取整得1,以此类推。最终得到3.14的二进制表示为11.00100011110101110000101。 2.将二进制数规范化。将小数点左移或右移,使得二进制数的第一位是1,是为规范化。例如,将上面的二进制数规范化为1.100100011110101110000101。 3.确定符号位。如果十进制数是正数,则符号位为0;如果是负数,则符号位为1。 4.将规范化后的尾数和指数转化为二进制数。指数的表示方法是将十进制指数加上一个偏置值,偏置值是2^(8-1)-1=127。例如,指数为3时,其二进制表示为127+3=130,即10000010。 5.将符号位、指数和尾数合并,得到32位的二进制数,即为3.14的IEEE 754标准32位浮点规格化数。 3.14的二进制表示为11.00100011110101110000101,符号位为0,指数为130的二进制表示为10000010,尾数为10010001111010111000010。将符号位、指数和尾数合并,得到32位的二进制数为01000001010010001111010111000010,即3.14的IEEE 754标准32位浮点规格化数为0x4048F5C3。其中,0x表示十六进制,4048F5C3是其十六进制表示。 ### 回答3: IEEE 754标准是一种二进制数表示方法,其中32二进制数按照规定格式表示浮点数。给定一个十进制数,需要将其转换成32位的IEEE 754规范化浮点数。 步骤如下: 1.将给定的十进制转换成二进制数。 比如,对于十进制数0.15625,可以使用乘2取整法转换为二进制数0.00101。 2.将二进制标准化。 标准化的二进制数即将小数点移到最左边,此时需要记录移动的位数。 对于0.00101,需要将小数点左移3位,得到规范化后的二进制数1.01。 同时,需要记录移动的位数,即-3,将其转换成二进制数0011。 3.确定符号位、阶码和尾数。 符号位为0,表示正数。 阶码为指数部分加上一个偏移值(127),即2的7次方。 对于0.00101,阶码为-3+127=124,转换成二进制数为01111100。 尾数即去掉整数部分的1之后剩余的位数,此处为01。 4.将符号位、阶码和尾数拼成32二进制数。 符号位为0,占用1位。 阶码占用8位,转化为二进制数为01111100。 尾数占用23位,为01000000000000000000000。 最终的32二进制数为0 01111100 01000000000000000000000。 这就是十进制数0.15625的IEEE 754规范化浮点数表示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值