在Matlab中进行类型转换

bat*_*man 3 c++ matlab

我理解了如何在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');
Run Code Online (Sandbox Code Playgroud)

然后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
Run Code Online (Sandbox Code Playgroud)

这意味着-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;
Run Code Online (Sandbox Code Playgroud)

我不能把a和b作为65304和47886.

Moh*_*nia 8

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

让我们尝试相反的方式

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

ans =

   -0.0022
Run Code Online (Sandbox Code Playgroud)

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

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

ans =

   ff18   bb0e

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

d =

   bb0eff18
Run Code Online (Sandbox Code Playgroud)

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

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

ans =

  -2.1819528e-003
Run Code Online (Sandbox Code Playgroud)

或者在您的环境中使用

>> format long e
>> A(1)
Run Code Online (Sandbox Code Playgroud)

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

  • @batuman我认为你需要使用`reinterpret_cast`而不是`static_cast`.请参阅此问题http://stackoverflow.com/questions/1723575/how-to-perform-a-bitwise-operation-on-floating-point-numbers (3认同)