提问人:PatrickDew 提问时间:11/14/2014 最后编辑:PatrickDew 更新时间:8/8/2017 访问量:7869
Float24(24 位浮点)到十六进制?
Float24 (24 bit floating point) to Hex?
问:
我使用浮点 24 位在 NXP 的编译器 MRK III 中存储浮点值。它将 24 位浮点值存储为 3 字节十六进制存储在数据存储器中。 现在,当我使用 IEEE 754 浮点转换将数字从二进制检索回实数时,我得到了一些非常奇怪的东西。
让我用一个例子来说明——
注意 - “由于我的编译器支持 float 24 位(以及 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)
问题:-
现在,当我尝试转换为二进制然后使用IEEE 754转回浮动时,我可以检索2.9612。
同时,当我尝试转换为二进制然后使用IEEE 754转回浮动时,我无法检索2.9612,而是一些奇怪的值。f32test = 40 3d 84 4d (in hex)
f24test = 02 3d 84 (in Hex)
我正在查看此 wiki 页面以参考浮点运算的 -: http://en.wikipedia.org/wiki/Single-precision_floating-point_format
我很困惑,如果我对 1 个符号位、8 位指数和 15 位尾数使用相同的格式,为什么它不适用于浮点数 24。(在浮点数 32 中,它是 1 个符号位、8 位指数和 23 位尾数。
你们中的任何一个人都可以帮我从???拿回 2.9612 的值f24test = 02 3d 84 (in Hex)
请做,在过去的 15 个小时里,我一直在为此苦苦挣扎:(
先谢谢你:)
答:
F32Test = 40 3d 84 4d (十六进制)
f24test = 02 3d 84 (十六进制)
在 IEEE 754 浮点格式中,浮点指数以偏置方式存储。显然,无论您指的是谁设计了 24 位浮点格式,都没有选择使用与 IEEE 754 二进制文件中使用的相同的偏置系统32,因为尽管两者的指数都用 8 位表示,但上述两种表示的指数位值不匹配(根据您的说法)。
在 32 位表示中,指数用位 0x80 表示,这听起来适合表示介于 2 和 4 之间的值。
您可以从 24 位格式的指数具有 0x04 偏差的假设开始,然后用更多值来确认这一点。单个值不足以让我们理解 24 位浮点格式,该格式不属于 IEEE 754 标准,并且显然设计了一些奇特的选择。
评论
我想这是一篇旧文章,但我会用我现在正在经历的经历来称赞它......
我还试图发现 NXP 如何表示 float24 数据类型。我正在编写一个小的测试宏,它将插入到更大的代码段中,并且我正在尝试使用 float24 数据类型,因为常规的 float 数据类型似乎会导致问题(我是一名实习生,所以我不确定为什么它会导致问题,也许我正在编写代码的目标无法支持 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 */
可悲的是,这些新信息仍然很神秘(偏见应该是什么?是否应该有偏见?变量“s”是什么?假设它意味着符号位,为什么它要乘以尾数,因为如果符号位为 0,乘法可能意味着结果等于 0?等)。
但是,这可能表明这个数字的结构是不同的。符号位不再是 MSB,而是紧跟在指数之后。这也意味着,在您的例子中,指数是 +2(因为您的十六进制数以 0x02 开头,这对应于 ByteValue[2])。
我希望这对任何偶然发现这篇文章的人有所帮助。我仍在尝试自己解决这个问题。请发表任何新想法。
评论
( 2^(-1) + m14 * 2^(-2) + ... + m0 * 2^(-16) ) * 2^e = ( 1 + m14 * 2^(-1) + ... + m0 * 2^(-15) ) * 2^(e - 1)
评论