나는 double을 사용하는 C 코드를 가지고있다. DSP (TMS320)에서 코드를 실행할 수 있기를 원합니다. 그러나 DSP는 double 형을 지원하지 않으며 오직 고정 소수점 형을 지원합니다. 코드를 고정 소수점으로 변환하는 가장 좋은 방법은 무엇입니까? 정수로 구현 된 고정 소수점 수를위한 좋은 C 라이브러리가 있습니까?어떻게 부동 소수점 C 코드를 고정 소수점으로 변환합니까?
답변
TI는 "IQmath"라는 고정 소수점 라이브러리 제공 :
http://focus.ti.com/lit/sw/sprc990/sprc990.pdf
현재 코드 분석을 포함 변환 - 당신이 그것을 저장할 수있는 범위를 알 필요가 각 변수를, 어떤 정밀도가 필요 . 그런 다음 저장할 유형을 결정할 수 있습니다. IQMath는 q30에서 +/- 2 범위와 0.0000000001 ~ q1의 정밀도 및 ~ +/- 1 백만 범위 및 정밀도 0.5의 유형을 제공합니다.
가능한 변수의 범위를 오버플로, 당신은 오버 플로우에 대한 검사를 추가해야하고 그것을 처리하는 방법을 결정할 수있는 작업에 대한- 등 최대, 축척이 다른 가게에서 그것을 핀, 오류를 제기,
실제로 프로세스의 데이터 흐름을 깊이 이해하지 않고 고정 소수점으로 변환 할 수있는 방법은 없습니다.
대부분의 DSP 툴체인은 소프트웨어에서 부동 소수점 에뮬레이션 용 라이브러리를 포함합니다. 이 작업은 느려지지만 먼저 부동 소수점 지원을 사용하여 코드를 작성한 다음 충분한 성능을 얻으려면 고정 소수점으로 변환해야하는 곳이 몇 개 있는지 확인해야합니다. 또한 고정 소수점으로 포팅 할 때 비교할 때 부동 소수점 연산을 실행해야 프로세스에서 아무 것도 잃지 않았는지 확인할 수 있습니다.
거기에 몇 가지 라이브러리가 있습니다. 더 많은 가능성이 있지만, 귀하의 장치에 대한 PSP는 수학 라이브러리의 일종을 포함해야합니다. 문서화되어야합니다. PSP에서 제공하는 API를 사용할 때 원시 기반 부동 소수점 산술을 수행 할 때 사용하는 컨트롤 구조가 의미가 없기 때문에 코드를 다시 작성해야 할 수 있습니다.
예를 들어 - C 코드 드문 드문, 당신은 부동 소수점 에뮬레이션 라이브러리를 사용할 수 있습니다 매우 드물게/복식을 사용하지 않는 경우이
double arraysum = 0.0;
for (int i = 0; i < arraylen; i++)
{
arraysum += array[i];
}
이
psp_decimal_t arraysum;
if (0 != psp_sum_elements(&array, arraylen, &arraysum))
{
printf("error!");
}
링크가 작동하지 않습니다. 정확한 내용을 입력하십시오. – Danijel
슬프게도, 나는 그 내용을 다른 곳이나 그것을 게시 한 개인에서도 찾을 수 없었습니다. –
로 변환 할 수 C 코드를 10 배에서 100 배 느리게 실행하지 않아도됩니다. 성능이 저하되고 부동 소수점 연산이 많이 발생하지 않고 모든 실제 입력에 대해 산술 및 저장 연산마다 필요한 스케일 및 정밀도를 알고 있다면 수동으로 각 산술 연산을 변환 할 수 있습니다. 스케일 된 정수 데이터 유형 및 연산을 사용했습니다. 그러나 정밀도 요구 사항을 분석하는 것은 일반적으로 DSP 유형 코드에 대해 중요하지 않습니다. 이 주제에는 많은 DSP 및 수치 방법 교과서 장이 있습니다.
... 마지막 문장을 정교하게 작성하십시오. 도움이 필요합니다. – jpinto3912
다음 코드는 정수를 내부 표현으로 사용하여 고정 유형을 정의합니다. 더하기와 빼기는 +
과 -
연산자로 간단히 수행됩니다. 곱셈은 정의 된 MULT
매크로를 사용하여 수행됩니다.
#include <stdio.h>
typedef int Fixed;
#define FRACT_BITS 16
#define FRACT_BITS_D2 8
#define FIXED_ONE (1 << FRACT_BITS)
#define INT2FIXED(x) ((x) << FRACT_BITS)
#define FLOAT2FIXED(x) ((int)((x) * (1 << FRACT_BITS)))
#define FIXED2INT(x) ((x) >> FRACT_BITS)
#define FIXED2DOUBLE(x) (((double)(x))/(1 << FRACT_BITS))
#define MULT(x, y) (((x) >> FRACT_BITS_D2) * ((y)>> FRACT_BITS_D2))
위의 코드를 사용하여 이미지 처리 알고리즘에서 분수를 나타 냈습니다. 복식을 사용하는 버전보다 빠르며 그 결과는 거의 동일합니다.
이 라이브러리를 확인하십시오 : [http://www.sf.net/projects/fixedptc](http://www.sf.net/projects/fixedptc) –
- 1. 부동 소수점을 다른 고정 소수점으로 변환하는 변환
- 2. 고정 소수점 알고리즘에서 부동 소수점 변환
- 3. String.Format() 고정 소수점 자리를 표시하는 부동 소수점?
- 4. 부동 소수점과 역으로 고정 소수점
- 5. C - 부동 소수점 올림 반올림
- 6. PHP에서 임의의 바이트 (0-255)를 부동 소수점으로 변환합니까?
- 7. 정밀도가 문자열에서 부동 소수점으로 지정
- 8. 어떻게 Java에서 소수점 이하를 소수점 이하로 변환합니까?
- 9. C++ 부동 소수점 문제
- 10. Android NDK OpenGL 앱의 부동 소수점 또는 고정 소수점?
- 11. 부동 소수점 대신 고정 소수점 연산을 수행하는 방법?
- 12. 부동 소수점 실수 부동 소수점 오류
- 13. 날짜/시간은 부동 소수점으로 저장되며 알고리즘이 사용됩니까?
- 14. 단 정밀도 부동 소수점 표현에서 반 정밀도 부동 소수점으로 숫자 변환
- 15. C 결과의 부동 소수점 빼기는
- 16. 부동 소수점 덧셈과 부동 소수점 곱셈의 상대 속도는 무엇입니까
- 17. 이 VB 코드를 어떻게 C#으로 변환합니까?
- 18. 이 코드를 Processing에서 C++로 어떻게 변환합니까?
- 19. C/C++에서 80 비트 부동 소수점 연산
- 20. yacc : 부동 소수점 숫자와의 구분
- 21. 부동 소수점 정밀도
- 22. x86의 c/C++에서 16.16 고정 소수점을 32 비트 부동 소수점으로 변환하는 가장 빠른 방법은 무엇입니까?
- 23. 어셈블리의 부동 소수점
- 24. 부동 소수점 선형 보간
- 25. 부동 소수점 반올림 감지
- 26. 이진 고정 소수점의 byte []를 부동 소수점 값으로 변환
- 27. Mips 부동 소수점 추가
- 28. C# - 32 비트 부동 소수점 라이브러리가 있습니까?
- 29. webSQL 부동 소수점 문제
- 30. VHDL : 부동 소수점에서 고정 소수점 설명으로 변환 하시겠습니까?
이것은 꽤 큰 주제입니다. 이 SO 질문에 대한 훌륭한 토론이 있습니다 : http://stackoverflow.com/questions/79677/whats-the-best-way-to-do-fixed-point-math. 거의 모든 답변에 유용한 덩어리가있었습니다. – mtrw
호기심에서 DSP 컴파일러는 고정 점을 어떻게 표현합니까? 두 개의 정수로? 예를 들어 두 개의 고정 소수점 숫자를 함께 추가하는 방법은 무엇입니까? – chrisaycock
이들은 32 비트 값 ('long')으로 표현되며 유형에 내재적으로 시프트됩니다. 예를 들어, 점 ('_iq16') 뒤에 16 비트가 있으면 기본 유형의 정수 65536으로 고정 소수점 수 1.0을 나타냅니다. 동일한 유형의 고정 소수점 수를 더하거나 뺄 때 표준 정수 연산을 사용할 수 있습니다. 곱셈은 스케일링을 수정하기 위해 추가 시프트가 필요합니다. – starblue