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


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.