마이크로 컨트롤러에서 고정 소수점 산술


12

종종 우리는 마이크로 컨트롤러를 사용하여 로봇에서 일을하지만 소수로 계산해야합니다. 부동 소수점 변수를 사용하면 소프트웨어 부동 소수점 라이브러리가 자동으로 포함되므로 (고급 마이크로 컨트롤러가없는 경우 ) 매우 느립니다. 따라서 일반적으로 고정 소수점 산술을 사용합니다.

내가 이것을 할 때마다 나는 정수를 사용하고 소수점 이하 자리를 기억합니다. 그러나 특히 계산에 소수점이 다른 위치에 변수가 포함 된 경우 모든 것이 일관되도록해야합니다.

고정 소수점 atan2 함수를 구현했지만 제한된 정밀도 (16 비트)의 모든 마지막 드롭을 압착하려고했기 때문에 소수점 위치의 정의를 변경하고 조정하면 변경됩니다. 또한 준 룩업 테이블로 상수가있을 것입니다.이 테이블에는 어딘가에 암시 점이 있습니다.

더 좋은 방법이 있는지 알고 싶습니다. 고정 소수점 변수의 사용을 단순화하고 혼합 변수 간의 곱셈과 나눗셈을 쉽게하고 10 진수 또는 상수 표현식을 선언 할 수는 있지만 컴파일시 원하는 고정 소수점 표현으로 자동 변환 할 수있는 라이브러리 또는 매크로 세트가 있습니까? 시각?


1
솔루션이 일반적이며 로봇 공학과 관련이 없기 때문에 이것이 실제로 스택 오버 플로우에 더 좋습니다.
Shahbaz

1
@Jakob-두 질문 모두 건설적이지 않은 것으로 종료되었습니다.
Mark Booth

1
이것은 C ++을 임베디드 시스템에 매우 유용하게 만드는 일종의 것입니다. 템플릿은 정확하고 최적의 코드를 자동으로 생성합니다.
Rocketmagnet

1
당신의 아탄 기능을 볼 수 있습니까? 나는 학업 연구에서 부동 소수점 고정 소수점 변환 문제를 해결하려고 노력 중입니다.
조 Hass

1
@ronalchn Arduino (AVR 마이크로) 언어의 일부 는 C ++로 구현됩니다. 도있다 AVR C ++ 라이브러리 . 그리고이 스레드 는 사용할 컴파일러입니다.
embedded.kyle

답변:


7

컴파일러에 각 고정 소수점 입력 변수의 범위와 정밀도 (아마도 같은 위치에 기수가있는 두 개는 없음)를 알려주고 컴파일 타임에 자동으로 올바른 범위를 사용하면 좋을 것입니다 및 일련의 계산에서 중간 값 및 최종 값에 대한 정밀도 및 스케일링 연산. 나는 Ada 프로그래밍 언어 또는 C ++ 템플릿에서 그렇게 할 수 있다는 소문을 들었습니다 .

아아, 내가 본 가장 가까운 고정 소수점 산술 라이브러리는 프로그래머가 수동으로 올바른 표현을 선택하고 각 작업이 적절한 범위와 정밀도를 유지하는지 수동으로 확인 해야하는 고정 소수점 산술 라이브러리입니다. 때로는 혼합 변수 사이의 곱셈과 나눗셈을 더 쉽게 만듭니다. 같은 :


C ++ 템플릿을 사용하여이 작업을 수행 할 수 있습니다.
Rocketmagnet

나는 실제로 "당신의 의견이 좋을 것 같다 ..."와 같은 일을하고 있습니다. 부동 소수점 C 코드를 고정 소수점으로 변환하여 모든 이진 소수점 위치를 최적화하는 gcc 용 플러그인입니다. ACM 저널에 논문을 제출했고 다른 논문을 준비 중입니다. atan 함수에 대한 C 코드가 있다면 샷을 기꺼이 줄 것입니다 ... 정수 변수를 사용하고 모든 고정 소수점을 수행하는 C 코드를 다시 줄 수 있습니다.
조 Hass

나의 것보다 훨씬 더 완전한 대답을 위해 +1. Mark Booth의 의견을 해결하기 위해 소스 코드를 요청할 수있는 링크를 포함하도록 링크를 편집했습니다. 링크도 업데이트하고 싶을 수도 있습니다. 나는 그것을 스스로 할 것이지만 제안 된 편집은 대기열에 있으며 나를 차단하고 있습니다.
embedded.kyle

1
@Rocketmagnet 템플릿을 사용하여 고정 소수점을 구현하는 것이 가장 확실합니다. FixedPoints (면책 조항 :이 글을 쓰고 여전히 '젊음'입니다)를 참조하십시오.
파라

gcc 링크 "a"가 깨짐
Lesto

2

TI IQMath 라이브러리 를 사용하여 고정 소수점 DSP에서 가상 부동 소수점을 구현했습니다.

Texas Instruments TMS320C28x IQmath 라이브러리는 C / C ++ 프로그래머가 부동 소수점 알고리즘을 TMS320C28x 장치의 고정 소수점 코드로 원활하게 이식 할 수 있도록 최적화 된 고정밀 수학 함수 모음입니다. 이러한 루틴은 일반적으로 최적의 실행 속도와 높은 정확도가 중요한 계산 집약적 인 실시간 응용 프로그램에서 사용됩니다. 이러한 루틴을 사용하면 표준 ANSI C 언어로 작성된 동등한 코드보다 훨씬 빠른 실행 속도를 달성 할 수 있습니다. 또한 TI IQmath 라이브러리는 바로 사용 가능한 고정밀 기능을 제공함으로써 DSP 애플리케이션 개발 시간을 크게 단축 할 수 있습니다.

그것은 TI 고유의 것들을 사용하지만 다른 마이크로 컨트롤러에서 가상 부동 소수점 수학을 구현하기 위해 해당 코드를 기본으로 사용했습니다. 포팅하는 데 약간의 작업이 필요하지만 처음부터 시작하는 것보다 훨씬 쉽습니다.


@downvoter 내 대답에 무엇이 잘못 되었습니까?
embedded.kyle

+1 :이 라이브러리는 현재 사용하고있는 것보다 낫습니다 ( "정수만 사용하십시오"). 그것은 원래의 질문에 대한 모든 것을 하지는 않지만, 완전한 해결책이 실제로 존재하지 않는 한 (유용하지만 완전한 해결책은 아니지만) 이와 같은 대답은 공감대를 가질 가치가 없다고 생각합니다 (이 경우 의심 스럽습니다) ).
David Cary

단일 범위의 장치에만 적용 되며 연설아닌 맥주 에서만 무료로 제공 되는 답변은 향후 방문자에게 제한적으로 사용되는 것으로 보입니다 .
마크 부스

@MarkBooth C28x 라이브러리에서 C64x 라이브러리로의 링크를 변경했습니다. 해당 링크를 따라 가면 소스 코드를 요청할 수 있습니다. 액세스하려면 회사 또는 대학 이메일이 필요합니다. 맥주 연설 에서처럼 여전히 무료 입니다. 대화하기 전에 손을 들고 전화를 기다리기만하면됩니다. 약간 성가 시지만 일단 소스 코드가 있으면 원하는 프로세서에 맞게 조정할 수 있습니다.
embedded.kyle

감사합니다 @ embedded.kyle 소스 코드는 바이너리보다 확실히 낫지 만 라이센스가 제한된 방식으로 만 사용할 수 있다면 여전히 거의 사용되지 않습니다. C6x Software Libraries 페이지 에 따르면 이 소스는 TI Commercial License에 의해서만 릴리스 되며, 말 그대로는 무료 가 아닙니다 .
마크 부스

1

Binary Scaling (일명 B 스케일링)에 대한 많은 구현 (즉시 알고있는 라이브러리 없음 )이 있습니다

이 경우, 소수점을 위 또는 아래로 이동하기 위해 교대를 사용하여 소수점이 어디에 있는지 정신 메모 (또는 더 나은 코드를 문서화하십시오 ...)를 유지하십시오.

방어 프로젝트, 심지어 가장 작은 CPU에서도 B- 스케일링을 어셈블러에서 사용했기 때문에 다른 것에 대한 적합성을 보증 할 수 있습니다 ...


아마도 이와 같은 것이지만 b 스케일링이라고하는 것을 본 적이 없습니다. 나는 그것을 고정 소수점으로 생각합니다-계산 과정에서 소수점이 변경 될 수 있기 때문에 소수점 하나는 항상 부동하지 않습니다. 하나의 변수는 항상 특정 위치에 소수점이 고정되어 있습니다
ronalchn

0

"포인트"가 어디에 있는지 기억하기 위해 정수를 사용하는 경우 부동 소수점 산술 사용합니다. 고정 점, 실제로 고정 점이 있습니다.

atancosππ

이는 응용 프로그램에 필요한 값의 범위에 따라 다르지만 고정 소수점 표현으로 완전히 이동할 수 있습니다. 예를 들어 다음과 같이 숫자를 유지하는 대신

struct num
{
    uint16_t number;
    uint16_t decimal_point;
};

여기서 number전체 수이고 decimal_point소수점이고, 당신이 이런 식으로 저장할 수 있습니다 말한다 :

struct num
{
    uint16_t integer;
    uint16_t fraction;
};

정수 integer.fraction는입니다. 동일한 메모리 사용량, 더 높은 값 범위 및 일반적으로 사용하기가 더 쉽습니다.


실제로 소수점을 저장하면 부동 소수점처럼 보입니다. 일반적으로 소수점은 컴파일 타임에 정의되며 작업에 따라 표현간에 변경됩니다.
Jakob

나는 변수에 저장된 것처럼 기억하지 않는다, 나는 결과를 해석하는 방법을 기억하는 것처럼 기억한다 (소수점이 어디에 있는지를 알면서)
ronalchn

@ronalchn, 알겠습니다. 당신과 같은 것을 의미 #define합니까? 나는 당신이 실제로 그것을 저장하고 당신의 숫자가 얼마나 크거나 작은 지에 따라 다를 수 있다고 생각했습니다.
Shahbaz

@ronalchn-당신은 B 스케일링을 생각하고 있습니까? (내 답변 참조)
Andrew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.