【问题标题】:Float24 (24 bit floating point) to Hex?Float24(24位浮点)到十六进制?
【发布时间】:2015-01-11 20:26:45
【问题描述】:

我使用 24 位浮点数将浮点值存储在 NXP 的编译器 MRK III 中。它将 24 位浮点值作为 3 字节十六进制存储在数据存储器中。 现在,当我使用 IEEE 754 浮点转换将数字从二进制恢复为实数时,我得到了一些非常奇怪的东西。

让我用一个例子来说明 -

注意 - “由于我的编译器支持 24 位浮点数(以及 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。 同时,当我尝试将 f24test = 02 3d 84 (in Hex) 转换为二进制然后使用 IEEE 754 返回浮动时,我无法检索 2.9612 而是一些奇怪的值。

我正在查看此 wiki 页面以参考浮点运算的 -:http://en.wikipedia.org/wiki/Single-precision_floating-point_format

如果我对 1 个符号位、8 位指数和 15 位尾数使用相同的格式,我很困惑为什么它不适用于浮点 24。 (在 float 32 中,它是 1 个符号位、8 位指数和 23 位尾数。)

谁能帮我从f24test = 02 3d 84 (in Hex)取回2.9612的值???

拜托,过去 15 个小时我一直在努力解决这个问题 :(

提前谢谢你:)

【问题讨论】:

  • 您是否有权访问有关 NXP float24 格式的任何文档?我在网上找不到任何东西。但正如 Pascal Cuoq 解释的那样,问题显然在于 8 位指数的编码。
  • @TonyK 是的……我有。由于它对我的项目保密,因此我不可能分享任何有关这方面的信息,但我希望我对 Pascal Cuoq 的回复能解释一些事情。 :)
  • 除非您能找到专门用于转换该格式的转换软件,否则您必须将其解构为符号、有偏指数和分数。然后,您可以使用这些值进行算术运算以生成浮点数。

标签: floating-point floating-accuracy floating-point-precision floating floating-point-conversion


【解决方案1】:

我想这是一篇旧帖子,但我会用我现在正在经历的经历来赞美它......

我还试图了解 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 个符号位、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)
【解决方案2】:

f32test = 40 3d 84 4d(十六进制)

f24test = 02 3d 84(十六进制)

在 IEEE 754 浮点格式中,浮点指数与 bias 一起存储。显然,您所指的设计 24 位浮点格式的人并没有选择使用与 IEEE 754 binary32 中使用的相同的偏置系统,因为尽管上述两种表示形式的指数位的值不匹配两者的指数都用 8 位表示(根据你的情况)。

在 32 位表示中,指数用 0x80 位表示,这听起来很适合表示 2 到 4 之间的值。

您可以从假设 24 位格式的指数具有 0x04 的偏差开始,并用更多的值来确认这一点。单个值不足以让我们理解不属于 IEEE 754 标准的 24 位浮点格式,并且显然在设计时有一些奇异的选择。

【讨论】:

  • 感谢您的回复。我知道在这种情况下,浮点数 24 非常特定于 NXP(MRK II),他们有自己的公式来计算它。希望这对 MRK III 也有效。
猜你喜欢
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 2014-11-18
  • 2016-11-06
  • 1970-01-01
  • 2014-03-01
相关资源
最近更新 更多