0

저는 float 24 비트를 사용하여 NXP의 컴파일러 MRK III에 부동 소수점 값을 저장합니다. 24 비트 부동 소수점 값을 데이터 메모리에 3 바이트 16 진수로 저장합니다. 이제 IEEE 754 부동 소수점 변환을 사용하여 이진수에서 실수로 숫자를 검색 할 때 매우 이상하게 보입니다.Float24 (24 비트 부동 소수점)를 16 진수로 변환 하시겠습니까?

주 - - ". 내 컴파일러가 지원 (플로트 (32)와 함께) 24 비트 부동 때문에, 나는이 같은 값 뭔가를 할당하고있어"

내가 예와 이런 식으로 넣어 보자

샘플 프로그램 : 디버그 창에서

float24 f24test; 
float f32test; 

f32test= 2.9612; 
f24test= (float24)f32test; 

출력 (전역 변수) - (동시에 데이터 메모리)를 DM에 저장

f32test = 2.961200e+000 
f24test = 2.9612e+000 

값 디버거에서 포착 -

f32test = 40 3d 84 4d (in hex) 

f24test = 02 3d 84 (in Hex) 

문제 : - 지금 변환하려고 할 때 f32test = 40 3d 84 4d (in hex) 이진수가 & 인 경우 IEEE 754를 사용하여 다시 플로팅하면 2.9612를 검색 할 수 있습니다. 동시에 f24test = 02 3d 84 (in Hex)을 이진 &으로 변환하려고 시도하는 동안 IEEE 754를 사용하여 다시 플로팅하는 동안, 2.9612 대신 몇 가지 이상한 값을 검색 할 수 없었습니다.

나에 대해 언급하는이 위키 페이지로 찾고 있어요 부동 소수점 연산의 - : http://en.wikipedia.org/wiki/Single-precision_floating-point_format

내가 1 개 기호에 대해 동일한 형식을 사용하고있는 경우는 플로트 (24)에 대해 작동하지 않는 이유는 혼란 스러워요 비트, 8 비트 지수 & 15 비트 가수. (float 32에서 1 부호 비트, 8 비트 지수, & 23 비트 가수)

여러분 중 누구라도 제가 f24test = 02 3d 84 (in Hex)에서 2.9612의 값을 얻을 수 있도록 도와 줄 수 있습니까 ???

제발, 내가

가 (16 진수)에 사전 :

+0

NXP float24 형식에 관한 모든 설명서에 액세스 할 수 있습니까? 웹에서 아무것도 찾을 수 없습니다. 그러나이 문제는 Pascal Cuoq이 설명하는 것처럼 8 비트 지수의 인코딩을 사용하는 것이 분명합니다. – TonyK

+0

@ TonyK 예 ... 있습니다. 그 프로젝트에 대한 기밀 사항이 있기 때문에, 나는 그것에 관한 어떤 정보도 공유 할 수 없지만 Pascal Cuoq에 대한 나의 대답이 뭔가를 설명하기를 바랍니다. :) –

+0

해당 형식을 변환하는 데 필요한 변환 소프트웨어를 찾을 수 없다면 기호, 편향된 지수 및 분수로 해체해야합니다. 그런 다음이 값을 사용하여 float을 생성하는 산술 연산을 수행 할 수 있습니다. –

답변

0

f32test = 40 차원 84 4D에 감사 :(지난 15시간

이 고민 했어요 f24test = 02 3d 84 (16 진수)

IEEE 754 부동 소수점 형식에서 부동 소수점 지수는 bias과 함께 저장됩니다. 분명히 언급 한 24 비트 부동 소수점 형식을 설계 한 사람은 IEEE 754 binary32에서 사용 된 것과 동일한 바이어스 시스템을 사용하지 않기로 결정했습니다. 위의 두 표현의 지수 비트 값이 두 지수의 지수는 8 비트로 표시됩니다 (귀하에 따라). 32 비트 표현

이 지수는 2와 4 사이의 값의 표현에 대한 권리 사운드 비트을 0x80로 표현

사용자는 가정에서 시작할 수 있다는의 지수 24 비트 형식에는 0x04의 바이어스가 있으며 더 많은 값으로이를 확인하십시오.우리가 IEEE 754 표준의 일부가 아닌 24 비트 부동 소수점 형식을 이해하는 데에는 단일 값으로는 충분하지 않으며 일부 이색적인 선택으로 분명히 설계되었습니다.

+0

응답 해 주셔서 감사합니다. 나는이 경우 플로트 24가 NXP (MRK II)에 매우 특이하다는 것을 알았고 & 그것을 계산할 자신의 수식을 가지고있다. 희망은 MRK III에도 적용됩니다. –

0

나는 이것이 이전 게시물입니다 생각,하지만 난 지금을 통과하고있는 경험이를 칭찬합니다 ...

또한 NXP는 float24 데이터 유형을 나타내는 방법을 발견하기 위해 노력하고 있습니다. 나는 훨씬 더 큰 코드 조각에 삽입 될 작은 테스트 매크로를 작성하고 있는데, 보통 float 데이터 유형이 문제를 일으킬 것으로 보이기 때문에 float24 데이터 유형을 활용하려고합니다. (저는 인턴입니다. 그것은 문제를 일으키는 것입니다, 아마도 코드를 쓰고있는 대상이 32 비트 부동 소수점 숫자를 지원할 수 없습니까?).

같은 것을 말합니다 코드의 더 큰 조각의 다른 엔지니어에서 왼쪽 몇 가지 메모 ...
/* ByteValue[0] : mantissa bits m7..m0 
    ByteValue[1] : sign bit, mantissa bits m14..m8 
    ByteValue[2] : exponent e7..e0 (signed, 2s complement repres.) 
    Actual value is 
    f = s * (2^(-1) + m14 * 2^(-2) + ... m0 * 2^(-16)) * 2^e */ 

는 슬프게도,이 새로운 정보로 가정 바이어스는 무엇인가 (아직 비밀입니다 있었다

왜 편견이있을 것입니까? 변수가 무엇입니까? 부호 비트를 의미한다고 가정하면, 곱셈은 부호 비트가 0이면 결과가 0과 같음을 암시 할 수 있기 때문에 왜 가수가 곱 해지는지 등) .

그러나이 숫자의 구조가 다른 것으로 나타날 수 있습니다. 부호 비트는 더 이상 MSB가 아니며, 지수 바로 다음에 나열됩니다. 이것은 또한 귀하의 경우 지수가 +2 (16 진수가 0x02로 시작하고 ByteValue [2]에 해당하기 때문에)임을 암시합니다.

나는이 게시물을 우연히 만나는 데 도움이되기를 바랍니다. 나는 아직도이 문제를 해결하려고 노력 중이다. 새로운 생각을 올리십시오.