我使用float 24 bit在NXP的编译器MRK III中存储浮点值。它将24位浮点值存储为数据存储器中的3字节十六进制。 现在,当我使用IEEE 754浮点转换将数字从二进制转换回实数时,我得到了一些非常奇怪的东西。
让我用一个例子 -
这样说注意 - "因为我的编译器支持float 24 bit(以及float 32),所以我指的是这样的值。"
示例程序:
float24 f24test;
float f32test;
f32test= 2.9612;
f24test= (float24)f32test;
调试窗口中的输出(全局变量): -
f32test = 2.961200e+000
f24test = 2.9612e+000
从调试器中捕获的存储在DM(数据存储器中)的值 -
f32test = 40 3d 84 4d (in hex)
f24test = 02 3d 84 (in Hex)
问题: -
现在,当我试图在二进制和&中转换f32test = 40 3d 84 4d (in hex)
时然后使用IEEE 754返回浮动,我可以检索2.9612。
在我试图转换二进制和{2}中的f24test = 02 3d 84 (in Hex)
的同时然后使用IEEE 754返回浮动,我无法检索2.9612而是一些奇怪的值。
我正在查看此维基页面,以了解浮点算术 - http://en.wikipedia.org/wiki/Single-precision_floating-point_format
如果我使用1符号位,8位指数和1的相同格式,我很困惑为什么它不适用于浮点数24。 15位尾数。 (在浮点32中,它是1个符号位,8位指数和23位尾数。)
你们中的任何人都可以帮助我从f24test = 02 3d 84 (in Hex)
获得价值2.9612 ???
请做,我在过去的15个小时里一直在努力:(
提前谢谢你:)
答案 0 :(得分:1)
我认为这是一篇很老的帖子,但我会赞美这个我现在正在经历的经历......
我也试图发现NXP如何表示float24数据类型。我正在编写一个小的测试宏,它将插入更大的代码片段中,我正在尝试使用float24数据类型,因为常规浮点数据类型似乎会导致问题(我是实习生,所以我不确定为什么它引起了问题,也许我编写代码的目标不能支持32位浮点数?)。
在更大的代码中,其他一些工程师留下了一些注释,说明了这样的内容......
/* ByteValue[0] : mantissa bits m7..m0
ByteValue[1] : sign bit, mantissa bits m14..m8
ByteValue[2] : exponent e7..e0 (signed, 2s complement repres.)
Actual value is
f = s * ( 2^(-1) + m14 * 2^(-2) + ... m0 * 2^(-16) ) * 2^e */
可悲的是,这个新信息仍然含糊不清(假设有什么偏见?是否存在偏见?变量是什么?假设它意味着符号位,为什么是它乘以尾数,因为如果符号位为0,则乘法可能意味着结果等于0。)。
然而,这可能表明该数字的结构不同。符号位不再是MSB,它在指数后面列出。这也意味着,在您的情况下,指数为+2(因为您的十六进制数字以0x02开头,并且对应于ByteValue [2])。
我希望这有助于任何人绊倒这篇文章。我仍在努力解决这个问题。请发布任何新想法。
答案 1 :(得分:0)
f32test = 40 3d 84 4d(十六进制)
f24test = 02 3d 84(十六进制)
在IEEE 754浮点格式中,浮点指数与bias一起存储。显然,无论是谁设计的24位浮点格式都没有选择使用与IEEE 754 binary32中使用的相同的偏置系统,因为上述两种表示的指数位值尽管不匹配两者的指数用8位表示(根据你的说法)。
在32位表示中,指数用位0x80表示,这对于表示2到4之间的值是正确的。
您可以从24位格式的指数偏差为0x04的假设开始,并使用更多值进行确认。单个值不足以让我们理解24位浮点格式,它不是IEEE 754标准的一部分,显然设计有一些奇特的选择。