0

我正在使用浮点型24位来将浮点值存储在恩智浦编译器MRK III中。它将24位浮点值作为3字节十六进制存储在数据存储器中。 现在,当我使用IEEE 754浮点转换将数字从二进制恢复为真实时,我收到了一些非常奇怪的东西。Float24(24位浮点数)为十六进制?

让我把它用一个例子这样 -

注 - “因为我的编译器支持浮动24位(与浮动32一起),我指定的值这样的事情”

样本程序:

float24 f24test; 
float f32test; 

f32test= 2.9612; 
f24test= (float24)f32test; 

在调试窗口输出(全局变量): - (在同一时间数据存储器)存储在DM

f32test = 2.961200e+000 
f24test = 2.9612e+000 

值作为从调试器捕获的 -

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

我很困惑,为什么它不浮子24工作,如果我使用的是相同的格式为1个符号位,8位指数& 15位尾数。 (在浮点数32是1符号位,8位指数& 23位尾数。)

可以让你们任何一个人帮我从f24test = 02 3d 84 (in Hex)得到值2.9612 ???

请你,我一直在努力与这个过去15小时:(

预先感谢您:)

+0

您是否可以访问任何关于恩智浦float24格式的文档?我在网上找不到任何东西。但是,Pascal Cuoq解释说,这个问题显然与8位指数的编码有关。 – TonyK 2014-11-14 13:51:34

+0

@TonyK是的...我有。由于它对我的项目保密,我不可能分享任何有关这方面的信息,但我希望我对帕斯卡尔·库克的回复能够解释一些事情。 :) – 2014-11-14 14:15:27

+0

除非您可以找到专门用于转换该格式的转换软件,否则必须将其解构为符号,偏向指数和分数。然后,您可以使用这些值进行算术运算以生成浮点数。 – 2014-11-14 15:54:49

回答

0

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位浮点格式,并且显然设计有一些奇特的选择。

+0

谢谢你的回应。我知道在这种情况下,浮点数24对恩智浦(MRK II)非常具体,他们有自己的公式来计算它。希望即使对MRK III也有效。 – 2014-11-14 13:58:33

0

我想这是一个老帖子,但我会称赞这跟我过,现在去体验......

我也试图发现恩智浦如何呈现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])。

我希望这可以帮助任何人绊倒这篇文章。我仍然试图自己解决这个问题。请张贴任何新的想法。