32 비트 부동 소수점을 24 비트 정규화 값으로 변환하는 방법을 알려주십시오. 내가 시도하는 것이입니다 (단위 * (1 < < 24)하지만, 작동하지 않는 것.이. 감사합니다 저를 도와주세요.이 작동하지 않습니다 물론C/C++ - 32 비트 부동 소수점 값을 24 비트 정규화 된 고정 소수점 값으로 변환합니까?
답변
(1 < < 24) 너무 큰 이 다른 방법을 넣어 정확히 1하여 저장하는 0을 대표 할 수있는 24 비트 숫자를 위해., 1 << 24
는 25 비트 수.
대신 (units * ((1 << 24) - 1))
을 고려 사실이다.
(1 << 24) - 1
은 0을 나타낼 수에서 시작 부호없는 24 비트 정수 최대 값이다. 지금
, 범위의 부동 소수점 수 [ 0.0 - 1.0 실제로는 오버 플로우없이 부호없는 24 비트 고정 소수점 정수에 적합 할 것이다.
정규화 된 고정 소수점 표현은 엄밀히 도달 할 수없는 최대 표현 가능 값이 1임을 의미합니다. 따라서 1은 1<<24
으로 표시됩니다. Q Formats도 참조하십시오.
예를 들어, Q24는 24 소수 비트, 0 정수 비트 및 부호 없음을 의미합니다. Q24를 관리하기 위해 32 비트 부호없는 정수를 사용하는 경우 계산을 쉽게하기 위해 나머지 8 비트를 사용할 수 있습니다.
부동 소수점 표현에서 부동 소수점 표현으로 변환하기 전에 항상 원래 값의 범위를 정의해야합니다. 예 : 부동 소수점 값 [0, 5)
의 범위에서 물리량이므로, 0은 포함하고 5 범위에 포함되지 않는, 그리고 고정 소수점 값이 5
#include <string.h>
#include <stdio.h>
float length_flp = 4.5; // Units: meters. Range: [0,5)
float time_flp = 1.2; // Seconds. Range: [0,2)
float speed_flp = 1.2; // m/sec. Range: [0,2.5)
unsigned uint32_t length_fixp; // Meters. Representation: Q24 = 24 bit normalized to MAX_LENGTH=5
unsigned uint32_t time_fixp; // Seconds. Representation: Q24 = 24 bit normalized to MAX_TIME=2
unsigned uint32_t speed_fixp; // m/sec. Repr: Q24 = 24 bit normalized to MAX_SPEED=(MAX_LENGTH/MAX_TIME)=2.5
void main(void)
{
printf("length_flp=%f m\n", length_flp);
printf("time_flp=%f sec\n", time_flp);
printf("speed_flp=%f m/sec\n\n", length_flp/time_flp);
length_fixp = (length_flp/5) * (1 << 24);
time_fixp = (time_flp/2) * (1 << 24);
speed_fixp = (length_fixp/(time_fixp >> 12)) << 12;
printf("length_fixp=%d m\n", length_fixp);
printf("time_fixp=%d sec\n", time_fixp);
printf("speed_fixp = %d msec [fixed-point] = %f msec\n", speed_fixp, (float)speed_fixp/(1 << 24) * 2.5);
}
이점도로 정규화 정규화 된 표현 사이의 연산은 정규화 된 값을 반환한다는 것입니다. 그런데 오버 플로우를 방지하고 정밀도를 저장하기 위해 각 연산 (나누기, 곱하기 등)에 대한 일반 함수를 정의해야합니다. 작은 트릭을 사용하여 speed_fixp
을 계산했습니다. 출력은
length_flp=4.500000 m
time_flp=1.200000 sec
speed_flp=3.750000 m/sec
length_fixp = 15099494 m [fixed-point]
time_fixp = 10066330 sec [fixed-point]
speed_fixp = 25169920 msec [fixed-point] = 3.750610 msec
'x * (1 << 24)'는 중복되어'(x) << 24'가 될 수 있습니다.이것이 8시 24 분 또는 40시 24 분 형식인지 또는 16 비트 임베디드 시스템에서 오버 플로우할지 여부의 모호성도 있습니다. 'uint32_t' 또는'uint64_t'와 같은 특정 타입을 사용해야하고 특정 변수가 정규화되기 전에 * 사용하거나 double/float으로 값 비싼 변환을 사용하는 명시 적으로 명료하게 (semantic'typedef uint32_t uint_fixed_8_24_t') 사용해야합니다. (참고 : [doom m_fixed.c] (http://doomwiki.org/wiki/Doom_source_code_files), 현재의 코딩 표준으로는 거의 맞지 않습니다.)주의 : C는 ints와 double을 기본값으로 사용합니다. – Barry
부동 소수점 왼쪽 피연산자 때문에'x << 24'를 사용할 수 없습니다. 고정 소수점 유형에 대한 자세한 내용을 추가했지만 문제는 명확하게 24 비트 정규화 값에 대해 이야기하고 있습니다. 플랫폼 독립 유형의 사용법은 절대적으로 옳습니다. – omegatre
- 1. 32 비트 고정 소수점 오버플로
- 2. 32 비트 부동 소수점 값에 관한 질문
- 3. 단 정밀도 32 비트 부동 소수점
- 4. 간단한 32 비트 부동 소수점 이미지 형식?
- 5. C# - 32 비트 부동 소수점 라이브러리가 있습니까?
- 6. IEEE 부동 소수점 변환 32 비트
- 7. 16 비트 부동 소수점
- 8. 고정 소수점 알고리즘에서 부동 소수점 변환
- 9. 부호없는 32 비트 고정 소수점 수 (16.16)
- 10. 부동 소수점 연산 32 비트 모드와 64 비트 모드
- 11. C의 32 비트 부동 소수점 숫자에서 비트 추출
- 12. 32 비트 대 64 비트 부동 소수점 성능
- 13. IEEE 24 비트 부동 소수점 값의 최소값은 어떻게됩니까?
- 14. 32 비트 부동 소수점 이미지의 픽셀 값을 인쇄하려고합니다.
- 15. Float24 (24 비트 부동 소수점)를 16 진수로 변환 하시겠습니까?
- 16. matlab에서 32 비트 부동 소수점 (IEEE 754) 변환
- 17. 정규화 정수/부동 소수점 변환
- 18. GLSL에서 32 비트 RGBA 부동 소수점 값 읽기
- 19. 부동 소수점과 역으로 고정 소수점
- 20. 고정 소수점 구현시 부동 소수점 예외 오류
- 21. PHP에서 논리 AND 두 부동 소수점 값 (32 비트)
- 22. 고정 값을 표시하는 부동 소수점 값
- 23. 위치 사용 : 부동 소수점 값으로 고정
- 24. 다른 플랫폼에서 32 비트 부동 소수점 계산 일관성을 유지하려면 어떻게해야합니까?
- 25. 64 비트 고정 소수점 곱하기 오류
- 26. 비트 연산자를 사용하여 부동 소수점 비교
- 27. CGImage에 32 비트 빅 엔디안 부동 소수점 데이터
- 28. OPenCV에서 32 비트 부동 소수점 이미지의 이미지 히스토그램을 계산하는 방법
- 29. 긴 정수 (32 비트)에 0.0000000004656f를 곱하기위한 부동 소수점 연산
- 30. 자바에서 32 비트 16 진수 문자열에서 부동 소수점 숫자로
정확히 '24 비트 정규화 값 '이란 무엇을 의미합니까? – hivert
24 비트 정규화 부호없는 정수 – user1128265
그래서 float에 정수가 있다고 가정합니까? 'f = 3.14159265359' 일 때 예상 답변은 무엇입니까? – hivert