【问题标题】:Convert floating point number from binary to a decimal number将浮点数从二进制转换为十进制数
【发布时间】:2013-03-13 18:06:30
【问题描述】:

我必须将浮点数从二进制转换为可用的十进制数。

当然我的浮点数已经被分割成字节,所以总共 4 个字节。
1 2 3 4
[xxxxxxxx][xxxxxxxx][xxxxxxxx][xxxxxxxx]

这 4 个字节已经转换为十进制,所以我有例如
1 2 3 4
[0][10][104][79]

现在尾数分为三个部分,两个最右边的字节(3 和 4)和字节 2,但没有 MSB 位(那个很容易被屏蔽,所以假设我们在那里也有一个不错的十进制数) .所以三个十进制数。

这三个十进制数是否有直接的数学转换为浮点尾数?

大意是这样:如果我需要得到一个整数,公式应该是
10 * 65536 + 104 * 256 + 79。

【问题讨论】:

  • 你为什么要手动做?
  • 这是IEEE 754浮点数还是其他格式?
  • 如果是IEEE 754,答案是否定的,不可能给出一个简单的公式来转换尾数,因为它的解释取决于指数。
  • sfstewman:不,它是在 UNIX 机器上用 C 语言创建的单精度 32 位浮点数。符号位:1 位指数宽度:8 位有效精度:24(显式存储 23) Patricia:我设置了完整位,因此即使它取决于指数,也可以进行转换,因为数据在那里。 Pieter:因为我是在第三方软件中做的,没有可用于此类任务的方法。
  • @pjercic:这很可能是一个单精度 IEEE 754 浮点数,但是您应该真正验证这一点,因为格式很重要,而且 C 和 Unix 本身都不够清楚,无法推断格式。 C 和 Unix 都适用于各种体系结构和各种浮点格式。

标签: math floating-point binary decimal


【解决方案1】:

将这些字节称为abc。我假设a 已经被屏蔽了,所以它只包含有效数位,没有指数位,并且该数字是 IEEE-754 32 位二进制浮点数,字节以适当的字节序排列。

如果原始指数字段是 1 到 254(因此,不是 0 或 255),那么有效位是:

1 + a*0x1p-7 + b*0x1p-15 + c*0x1p-23

或者,等效地:

(65536*a + 256*b + c) * 0x1p-23 + 1.

如果原始指数字段为 0,则从总和中删除 1(该数字为次正规或零)。如果原始指数字段为 255,则浮点值为无穷大(如果 abc 均为 0)或 NaN(否则)。

【讨论】:

  • 这个答案假定 IEEE 754 单精度浮点数。
  • 抱歉,只是问一下 0x1p-23 是比例因子,它的意思是 1 * 2 ^ -23 即 0.00000011920928955078125?我说的对吗?
  • @pjercic:是的。十六进制浮点数是 C 的一部分。它们的格式为“0x”,一些十六进制数字可选地包括句点、“p”,十进制指数可选地包括符号。指数是二的幂。十六进制数字是精确表示二进制浮点值的好方法。
  • 对不起,我实际上删除了评论,因为错误是在服务器端使用浮点数的 ntohl() ,这严重破坏了它。记住我的话,ntohl() 是浮动的敌人。谢谢你的回答,我现在可以工作了。
【解决方案2】:

我帮不上什么忙,因为我已经有一段时间没有进行转换了,但我希望 this tutorial 对您有用。

【讨论】:

  • 谢谢,我关注了这个。
猜你喜欢
  • 2014-11-24
  • 1970-01-01
  • 1970-01-01
  • 2014-03-01
  • 1970-01-01
  • 2016-12-25
  • 2017-02-23
  • 2015-10-11
  • 2011-08-11
相关资源
最近更新 更多