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

Floating point 浮点24(24位浮点)到十六进制?,floating-point,floating-accuracy,floating-point-precision,floating,floating-point-conversion,Floating Point,Floating Accuracy,Floating Point Precision,Floating,Floating Point Conversion,我使用浮点24位在NXP的编译器MRK III中存储浮点值。它将24位浮点值作为3字节十六进制存储在数据存储器中。 现在,当我使用IEEE 754浮点转换来检索从二进制到实数的数字时,我得到了一些非常奇怪的东西 让我举个例子来说明这一点- 注意—“由于我的编译器支持浮点24位(以及浮点32位),所以我将赋值如下。” 示例程序: float24 f24test; float f32test; f32test= 2.9612; f24test= (float24)f32test; 调试窗口中的输

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

让我举个例子来说明这一点-

注意—“由于我的编译器支持浮点24位(以及浮点32位),所以我将赋值如下。”

示例程序:

float24 f24test;
float f32test;

f32test= 2.9612;
f24test= (float24)f32test;
调试窗口中的输出(全局变量):-

从调试器捕获的存储在DM(同时数据存储器)中的值-

f32test = 40 3d 84 4d (in hex)

f24test  = 02 3d 84  (in Hex)
问题:- 现在,当我试图将f32test=403d844d(十六进制)转换成二进制时&然后使用ieee754返回浮点,我可以检索到2.9612。 同时,当我尝试将
f24test=023d84(十六进制)
转换为二进制,然后使用ieee754返回浮点值时,我无法检索到2.9612,而是一些奇怪的值

我正在查看此wiki页面,以了解浮点运算的-:

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

你们中有谁能帮我从
f24test=023d84(十六进制)

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

提前感谢:)

F32测试=40 3d 84 4d(十六进制)

F24测试=02 3d 84(十六进制)

在IEEE 754浮点格式中,浮点指数存储为。显然,无论是谁设计了您所指的24位浮点格式,都没有选择使用与IEEE 754 binary32中使用的相同的偏置系统,因为上面两种表示的指数位的值不匹配,尽管它们的指数都用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开始,对应于字节值[2])


我希望这有助于任何人绊倒在这个职位上。我仍在努力自己解决这个问题。请发表任何新想法。

您有权访问任何关于NXP float24格式的文档吗?我在网上找不到任何东西。但问题显然在于8位指数的编码,正如Pascal Cuoq解释的那样。@TonyK是的……我确实有。由于这是我项目的机密,我不可能分享任何关于这方面的信息,但我希望我对Pascal Cuoq的回复能解释一些事情。:)除非您能找到特定于转换该格式的转换软件,否则必须将其解构为符号、有偏指数和分数。然后,您可以使用这些值进行算术运算,以生成浮点。感谢您的回复。我知道,在这种情况下,float 24非常特定于NXP(MRK II)&他们有自己的公式来计算它。希望这对MRK III也有效。根据您所描述的,似乎有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)
 /* 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 */