我无法将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
的浮点数,它与我计算的任何数字几乎没有相似之处。我错过了什么?
提前致谢,
伊恩
答案 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
所以,对于这个数字的三个部分,我们有:
所以完整的数字是:
0 1001011:1 0010111:10000111:01000000
s eeeeeee e mmmmmmm mmmmmmmm mmmmmmmm
或十六进制,具体取决于已结束:4b978740
/ 4087974b
。