batuman
batuman

Reputation: 7304

typecast in Matlab

I understood how typecast explained in the help file in the Matlab. But can't cope for my result. I tried to typecast a 3x4 matrix as follow.

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');

Then ANS vector becomes

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

That means -0.0022 have two 16 bits values of 65304 and 47886. How is it calculated? Then how can I implement in C++? In C++, I implemented like

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

I can't have a and b as 65304 and 47886.

Upvotes: 3

Views: 545

Answers (1)

Mohsen Nosratinia
Mohsen Nosratinia

Reputation: 9864

The value -0.0022 is being converted to two 16-bit values and that means your values are of type single (not double).

Let's try the other way around

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

ans =

   -0.0022

Now let's see the hexadecimal representation of these values look like:

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

ans =

   ff18   bb0e

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

d =

   bb0eff18

Now you see that the first value, 65304, is the LSB 16-bit and 47886 is the 16-bit MSB. Therefore, your C++ implementation is correct. The reason that you do not get the correct values in C++ is that the value is not exactly equal to -0.0022. Since your environment is using the default format of short you do not see all significant digits. if you try this

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

ans =

  -2.1819528e-003

or in your environment just using

>> format long e
>> A(1)

You find the actual value in the array, and using it in your C++ code, should return the correct value.

Upvotes: 8

Related Questions