부동 소수점을 Q31 고정 소수점으로 변환해야하며, Q31은 1 부호 비트를 의미하고 정수 부분은 0 비트이고 소수 부분은 31 비트로 변환해야합니다. 즉, Q31은 [-1,0.9999]
범위의 숫자 만 나타낼 수 있습니다.매핑 [-1, + 1]은 Q31 고정 소수점으로 부동합니다.
은 고정 소수점 플로트 변환 할 때, 2ˇN
의한 승산은, 난이 코드와 혼동있어 31
그러나,이 경우, N은 소수 부분의 크기이고, 수행 잘 보이지 않지만 작동합니다 :
#define q31_float_to_int(x) ((int) ((float)(x)*(float)0x7FFFFFFF))
잘 작동하는 것 같습니다. 예 :
int a = q31_float_to_int(0.5f);
은 Hex: 0x40000000
입니다.
왜 여기에서의 승산은 2ˇ31 - 1
일 뿐이며 2ˇ31
이 아닌가?
'(플로트) 0x7FFFFFFF'는'2147483648.00000'은 http : //ideone.com/mawlXx. 'unsigned'로 캐스팅 한 후에도 값이 유지됩니다. http://ideone.com/7WMeRE – mch
Hmm ?? 어떻게 0x7FFFFFFF가 2147483648이 아닌 2147483647로 끝나는가 ?? – Danijel
2147483647은 'float'로 표현할 수 없기 때문에 2147483648 인 가장 가까운 대표 번호를 취합니다. – mch