3

我了解在 Matlab 的帮助文件中如何解释类​​型转换。但无法应付我的结果。我尝试按如下方式对 3x4 矩阵进行类型转换。

A= -0.0022  -87.8788  -96.2848  -96.9586
    0.9891  -52.9250  -52.7722  -52.7780
    0.1473   -4.8680   -6.0184   -5.9894

ANS = typecast(A(:), 'uint16');

然后 ANS 向量变为

ANS=65304
    47886
    13518
    16253
    55853
    15894
    49650
    49839
    45875
    49747
    50835
    49307
    37329
    49856
     5820
    49747
    38546
    49344
    60110
    49857
     7340
    49747
    43369
    49343

也就是说,-0.0022 有两个 16 位值 65304 和 47886。它是如何计算的?那我如何在 C++ 中实现呢?在 C++ 中,我实现了

float f = -0.0022;
unsigned short a = static_cast<unsigned int>(f);
unsigned short b = static_cast<unsigned int>(f)>>16;

我不能将 a 和 b 作为 65304 和 47886。

4

1 回答 1

8

值 -0.0022 被转换为两个 16 位值,这意味着您的值是单类型(不是双精度)。

让我们换个方式试试

>> typecast(uint16([65304 47886]), 'single')

ans =

   -0.0022

现在让我们看看这些值的十六进制表示形式如下:

>> format hex
>> uint16([65304 47886])

ans =

   ff18   bb0e

>> d=typecast(uint16([65304 47886]), 'single')

d =

   bb0eff18

现在您看到第一个值 65304 是 LSB 16 位,而 47886 是 16 位 MSB。因此,您的 C++ 实现是正确的。在 C++ 中没有得到正确值的原因是该值不完全等于 -0.0022。由于您的环境使用的是默认值formatshort因此您不会看到所有有效数字。如果你试试这个

>> format long e
>> typecast(uint16([65304 47886]), 'single')

ans =

  -2.1819528e-003

或在您的环境中使用

>> format long e
>> A(1)

您在数组中找到实际值,并在您的 C++ 代码中使用它,应该会返回正确的值。

于 2013-08-19T07:16:47.700 回答