2013-08-19 4 views
3

Matlab의 도움말 파일에서 타입 변환이 어떻게 설명되었는지 이해했습니다. 하지만 내 결과에 대처할 수는 없습니다. 다음과 같이 3x4 행렬을 유형 변환하려고했습니다.Matlab의 타입 변환

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 벡터 -0.0022가 65,304 및 47886. 두 개의 16 비트 값이 어떻게 계산 한 수단

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 

된다? 그러면 C++로 어떻게 구현할 수 있습니까? 는 C++에서, I는 I가 65304 및 47886.

답변

8

값 -0.0022은 2 개의 16 비트 값으로 변환되는 바와 같이 A 및 B를 가질 수

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

처럼 구현하고는 값을 의미 단일 유형 (이중이 아님)의 이제

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

ans = 

    ff18 bb0e 

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

d = 

    bb0eff18 

첫 번째 값 65,304에서, LSB (16)임을 알 :

의이의이 값의 16 진수 표현 모양을 보자 이제 다른 방법으로 주위

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

ans = 

    -0.0022 

해보자 47886은 16 비트 MSB입니다. 따라서 C++ 구현이 정확합니다. C++에서 올바른 값을 얻지 못하는 이유는 정확히 값이 -0.0022와 같지 않기 때문입니다. 귀하의 환경이 기본값 format (short)을 사용하고 있으므로 모든 유효 자릿수가 표시되지 않습니다. 그냥

>> format long e 
>> A(1) 

를 사용하여이

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

ans = 

    -2.1819528e-003 

또는 환경을하려고하면 배열의 실제 값을 찾아 올바른 값을 반환해야합니다, 당신의 C++ 코드에서 사용.

+0

많은 설명에 많은 감사드립니다. – batuman

+0

하지만 아직 뭔가가 없습니다. float f = -8.7878799e + 001처럼 C++에서 시도한 경우; 부호없는 짧은 a = static_cast <부호없는 int> (f); unsigned short b = static_cast (f) >> 16; 저는 65449와 65535를 받았습니다. 그렇다면 형 변환 (uint16 ([65449 65535]), '단일'), NaN을 얻었습니다. – batuman

+3

@batuman'static_cast' 대신'reinterpret_cast'를 사용해야한다고 생각합니다. 이 질문보기 http://stackoverflow.com/questions/1723575/how-to-perform-a-bitwise-operation-on-floating-point-numbers –