【问题标题】:How do I interpret two 32-bit unsigned integers as a 64-bit floating-point ("double") value?如何将两个 32 位无符号整数解释为 64 位浮点(“双精度”)值?
【发布时间】:2015-03-25 22:57:17
【问题描述】:

我对matlab的了解非常有限,所以我会用更笼统的术语来解释我的问题:

我们有一个记录系统,可以实时对嵌入式系统中的变量进行采样,并将记录的数据作为 matlab 文件进行分析。

我的问题是,如果记录的变量是“双精度”(更具体地说是 64 位,IEEE 754-1985,浮点值),结果将作为两个无符号 32 位整数传递,而我没有想法如何在 matlab 中将其转回浮点值。

例如,如果我记录变量SomeFloat,它是一个double,我将记录的数据作为两组数据,SomeFloat1SomeFloat2。两者都是无符号的 32 位整数。 SomeFloat1 包含 SomeFloat 的 32 个最高有效位,SomeFloat2 包含 32 个最低有效位。

我希望找到一个现有的函数来将它转换回来做一个双精度,我的意思是:

MyDouble = MyDreamFunction(SomeFloat1, SomeFloat2)

我一直无法找到MyDreamFunction,但是对于 matlab 的新手,我不太确定去哪里找...

那么,有谁知道一个简单的方法来做到这一点?

【问题讨论】:

  • 您是否考虑过尝试修复记录系统写入其值的方式,因为您似乎正在解决其中的一个(非常烦人的)错误或限制?
  • @NeilSlater 你是绝对正确的。不幸的是,这不是我当前问题的选择,但我肯定会建议对记录系统进行更改。
  • @NeilSlater。 OP提到了嵌入式系统。这可能不是那么灵活。我经常使用 8051 微控制器,而该死的东西是 8 位。我记录了 16 位和 32 位的值,但是当我将其传输到 PC 时,一次只有 8 位。所以我必须经常使用typecast(如下面@LuisMendo 的回答)来重建我的值,一旦它们到达PC(更糟糕的是,8051 以大端顺序向我发送值,所以我也必须缓冲然后随机播放字节...... pffff)。

标签: matlab


【解决方案1】:

我想你想要typecast(在不改变底层数据的情况下转换数据类型):

>> x1 = uint32(7346427); %// example uint32 value
>> x2 = uint32(1789401); %// example uint32 value
>> typecast([x2 x1],'double')
ans =
  1.4327e-306
>> typecast([x1 x2],'double')
ans =
  3.7971e-308

【讨论】:

  • typecast 绝对是要走的路。它需要为你做 2^n 的奇数乘法的所有麻烦。
  • 是的,就是这样 - 谢谢,路易斯!当我们第一次尝试它时,我们只得到了垃圾,但事实证明,这是损坏的数据。似乎数据定义中有一位未对齐,这意味着应该是我们的双精度的 32+32 位实际上是实际双精度的 63 位,以及相邻数据字段的一位。当他们解决这个问题时,我们甚至可能从一开始就得到一个双倍:)
  • @Boise 很高兴我能帮上忙!是的,在靠近硬件的地方工作总是有这样的困难
猜你喜欢
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 2011-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多