ieee浮点格式

时间:2011-11-19 11:59:03

标签: floating-point ieee-754

我无法将19861119转换为ieee浮点格式(单精度)。我希望有人可以告诉我,我迷失了方向。

在二进制中,值为b1:00101111:00001110:01111111(使用:标记来自rhs的每8位),即b1.00101111:00001110:01111111 * 2^24。因此浮点数为b00101111:00001110:01111111,偏差指数为24 + 127 = 151 = b10010111。浮点数是24位长,但ieee格式只允许23位,这对我来说是个问题。格式是否缺乏足够的精度来存储yyyymmdd日期?

当我将Python的struct.pack("f", 19861119)的输出写入文件并使用十六进制编辑器查看时,我看到x4087974b。允许小端,这是x4b978740。因此,Python编写了一个有偏差的指数b01010111 = 87和一个b0010111:10000111:01000000的浮点数,它与我计算的任何数字几乎没有相似之处。我错过了什么?

提前致谢,

伊恩

3 个答案:

答案 0 :(得分:1)

数字存储舍入:19861120变为0x4B978740。未舍入的值为0x4B97873F。

这是二进制的0x4B978740:

0   10010111   [1]   0010111 10000111 01000000

+   127 + 24    1                   ~ .1838150

2 24 = 16777216。

online float calculator非常适合探索此类细节。

谈论IEE754中的舍入模式可能会填满整篇论文......

答案 1 :(得分:1)

原始号码是:

1 0010 1111 0000 1110 0111 1111

我们正常化:

1,0010 1111 0000 1110 0111 1111 x 2²⁴

由于只存储了小数部分的23位:

  1,0010 1111 0000 1110 0111 111 x 2²⁴
                              +1 (if rounded)
= 1,0010 1111 0000 1110 1000 000 x 2²⁴

= 0|100 1011 1|001 0111 1000 0111 0100 0000
  s    exp         23 bit fractional part
= 0x4B978740

如果我理解得很好,那就是你得到的。

答案 2 :(得分:0)

32位单精度没有足够的精度来存储YYYYMMDD个日期。假设我们达到2000万,即25位。所以你总是失去一点。

浮点格式要记住的一点是,在尾数部分,第一个数字始终为1.单精度和双精度通过不存储它来利用它。

用你的记谱法:19861119 = +1 * b1.00101111:00001110:01111111 * 2^24

所以,对于这个数字的三个部分,我们有:

  1. 标志为0。
  2. 指数部分是127 + 24 = 151 = b1001011:1
  3. 尾数部分是初始零后的前23位,舍入为偶数:`0010111:10000111:01000000
  4. 所以完整的数字是:

    0 1001011:1 0010111:10000111:01000000
    s eeeeeee e mmmmmmm mmmmmmmm mmmmmmmm
    

    或十六进制,具体取决于已结束:4b978740 / 4087974b