2014-11-03 3 views
0

데이터 수집을 위해 다른 플랫폼 (일부는 컴퓨터, 일부는 전자 보드)간에 32 비트 부동 소수점 값을 전달해야합니다. 통신 프로토콜에서 NAN 수레를 사용하여 오류를 전달하고 싶습니다. 문제는 많은 NAN이 있으며 특히 0x7FA00000을 사용하고 싶습니다.float에 Int32 NAN 캐스팅

float value = DAQ_SYSTEM_ERROR; 

를 얻을하지 않습니다

문제가
#define DAQ_SYSTEM_ERROR (0x7FA00000) 

, 이것은 유효한 32 비트 정수하고 있습니다 :

그래서, 내가 정의하는 헤더를 가지고 싶습니다 원하는 결과.

너무 많은 코드없이이를 점으로 찍을 방법이 있습니까? 구체적으로 컴파일러에서 원하는대로 재 컴파일 캐스팅 지시문을 사용할 수 있습니까? 나는 그것이 가능해야한다고 생각하지만, 나는 그것을 관리 할 수 ​​없다.

코드는 C, C++, Objective-C 및 Swift에서 작동해야합니다.

편집은 귀하의 의견 주셔서 감사합니다. 저는 참으로 한 가지 가치에만 관심이 있습니다. 아이디어는 float을 얻은 다음 NAN (0x7FA00000으로 정의 됨)을 검사하여 검색된 값이 유효한 측정인지 (기록되어야하는지) 또는 어딘가에 오류가 발생했는지 여부를 확인합니다.이 경우 값을 버려야하고 제기하는 플래그. "전송"플랫폼에서 float 값은 0x7FA00000 값의 영향을받습니다. 수신 플랫폼에서 바이트는 0x7FA00000과 비교하여 먼저 디코딩 된 다음 모든 것이 잘 진행되면 float에 채워집니다.

+0

'float value = 1./0' MAY (표준이 UB인지 아닌지는 알 수 없습니다. 편집 : 또한, 노조를 사용하여 0x7FA00000 정수를 설정 한 다음 float 값을 끌어낼 수 있지만 엔디안 종속입니다 – Creris

+2

@Creris IEEE 단 정밀도 부동 소수점에 대한 NAN 값을 나타내는 16,777,214 가지 다른 방법이 있습니다. OP는 그 중 특정 하나를 원합니다. – ikegami

+0

'union a {int a; float b} u; u.a = 0x7FA00000; return u.b; '트릭을해야합니다. 다시 이것은 엔디안 종속입니다 – Creris

답변

1

컴파일 타임에 float에 캐스트 할 정확한 비트 패턴을 지정할 방법이 없습니다. ((float) 0x7FA00000)은 방금 2141192192.0이됩니다. float 값으로 특정 비트를 얻을 수있는 유일한 방법은 런타임에 포인터를 통해입니다 :

float fval; 
uint32_t fbits = 0x7FA00000; 

. . . 

memmove(&fval, &fbits, sizeof float); 

대부분의 컴파일러는 또한 받아 들일 :

*((uint32_t *)(& fval)) = fbits; 

memmove를()가 더 휴대용이지만.

+0

고맙습니다. 당신은 저에게 아이디어를주었습니다 : 공용체를 사용하고, 전역 const 정적 변수를 선언하고 그것을 #define 매크로로 채 웁니다.이 방법을 사용하면 코드의 대부분을 cnahge 할 필요가 없습니다 (지금까지 오류는 float에 대해 물리적으로 불가능한 값을 사용하여보고되었습니다). – Adeline

+0

그래, 노조도 일할거야. –