Float24(24 位浮点)到十六进制?

Float24 (24 bit floating point) to Hex?

提问人:PatrickDew 提问时间:11/14/2014 最后编辑:PatrickDew 更新时间:8/8/2017 访问量:7869

问:

我使用浮点 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 个小时里,我一直在为此苦苦挣扎:(

先谢谢你:)

浮点精度 转换

评论

0赞 TonyK 11/14/2014
您是否可以访问有关 NXP float24 格式的任何文档?我在网上找不到任何东西。但正如 Pascal Cuoq 所解释的那样,问题显然出在 8 位指数的编码上。
0赞 PatrickDew 11/14/2014
@TonyK是的......我确实有。由于它对我的项目保密,我不可能分享任何有关它的信息,但我希望我对 Pascal Cuoq 的回复能解释一些事情。:)
0赞 Patricia Shanahan 11/14/2014
除非您能找到特定于转换该格式的转换软件,否则您将不得不将其解构为符号、偏置指数和分数。然后,您可以使用这些值进行算术运算以生成浮点数。

答:

0赞 Pascal Cuoq 11/14/2014 #1

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 标准,并且显然设计了一些奇特的选择。

评论

0赞 PatrickDew 11/14/2014
感谢您的回复。我知道在这种情况下,浮点数 24 非常特定于 NXP (MRK II),他们有自己的公式来计算它。希望这甚至适用于 MRK III。
1赞 William S. 8/8/2017 #2

我想这是一篇旧文章,但我会用我现在正在经历的经历来称赞它......

我还试图发现 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])。

我希望这对任何偶然发现这篇文章的人有所帮助。我仍在尝试自己解决这个问题。请发表任何新想法。

评论

1赞 Edy 5/15/2018
从您的描述来看,似乎有 1 个符号位、8 个指数位和 15 个分数位;就“IEEE 754 术语”而言,偏差仅为 1,如下式所示:( 2^(-1) + m14 * 2^(-2) + ... + m0 * 2^(-16) ) * 2^e = ( 1 + m14 * 2^(-1) + ... + m0 * 2^(-15) ) * 2^(e - 1)