IEEE浮点数

浮点数编码转换采用的是IEEE规定的编码标准,float和double的转换方式相同,但是取值范围不同,编码方式有些许区别.IEEE规定的浮点数编码会将一个浮点数转换成二进制数.以科学计数法划分,将浮点数分为3个部分:符号,指数,尾数 

浮点类型:float转IEEE格式

在存储方式上都是遵守IEEE浮点数的规范

Float的存储方式

lua小数转换为ieee754 28.75转换为ieee短浮点数_浮点数

 

Double的存储方式

lua小数转换为ieee754 28.75转换为ieee短浮点数_lua小数转换为ieee754_02

 

举例说明:

8.25转为浮点存储

  1. 转二进制:8.25   <=>   (二进制)1000.01
  2. 算指数: 找最高有效位                                                                                                                         1000.01  = 1.0001*2的3次方 小数点左移3位 指数为3                                                               小数点移动规则:找最高有效位   1为最高有效位 
  3. 填表

                符号位:本来是正数就填0 本来是负数就填1

                指数部分:

                        1.第一种方式

                                第一位 如果上面的小数点左移就填1 右移就填0 指数为3 现在用3-1等于2                                       二制是10 所以1000 0010

                        2.第二种方式

                                  我们知道指数为3,现在和127相加(127+3 = 130 左移就是+ 右移就是-),

                                  转为二进 制1000 0010  这里的127不做深究

                尾数部分:1.00001的小数部分填写到尾数 不够23补0

符号位(1)

指数部分(8)

尾数部分(23位)

0

1000 0010

00001000000000000000000


0100 0001 0000 0100 0000 0000 0000 0000

IEEE浮点数:41040000

lua小数转换为ieee754 28.75转换为ieee短浮点数_lua小数转换为ieee754_03

 

浮点数为负数

-8.25

符号位(1)

指数部分(8)

尾数部分(23位)

1

1000 0010

00001000000000000000000


lua小数转换为ieee754 28.75转换为ieee短浮点数_有效位_04

小数点右移动

1.0.25  <==>  0.01(二进制)

2.本着最高位为有效位(1)的原则 向右移动2次

0.01 = 1.0*2的-2次方 指数为-2

3.填表

        符号位:0.25正数 填1

        指数部分:

                第一种方式:

                    刚是右移动小数点 最高位0   指数为-2 - 1 等于-3  -3的二进制  1111 1101 填写指        

                    数的时候最高位已经是0 所以 0111 1101

                第二种方式

                    127-2=125      125的二进制 0111 1101

                尾数部分:1.0 尾数部分是23个0

符号位(1)

指数部分(8)

尾数部分(23位)

0

0111 1101

00000000000000000000000

0011 1110 1000 0000 0000 0000 0000 0000

3e80 0000

 

lua小数转换为ieee754 28.75转换为ieee短浮点数_存储方式_05

 IEEE浮点数转float

举例:

IEEE浮点数:41040000

41040000 转二进制 0100 0001 0000 0100 0000 0000 0000 0000

填表

符号位(1)

指数部分(8)

尾数部分(23位)

0

10000010

000 0100 0000 0000 0000 0000

反推:

取出尾数部分

000 0100 0000 0000 0000 0000

最高有效位为1

1.000 0100 0000 0000 0000 0000

现在小数点的位置是不对的 我们还要看指数部分10000010 十进制是  130

还记得之前的127吗 130和127相差3 130大于127说明指数是+了一个数字 也就是3

也就是之前右移动了3位 最后得到

1000.01 转十进制 8.25