2013-04-09 2 views
9

주 프로세서에 보조 프로세서가 연결되어 있습니다. 일부 부동 소수점 계산은 보조 프로세서에서 수행해야하지만 하드웨어 부동 소수점 명령어는 지원하지 않으며 에뮬레이션이 너무 느립니다.정수로 부동 소수점 계산을 수행하는 방법

부동 소수점 값을 스케일링하여 정수로 표현하고, 코 프로세서에 보내고, 계산을 수행하고, 반환 할 때 그 값을 스케일 할 수있는 방법이 있습니다. 그러나 숫자가 결국 정수의 범위를 벗어나기에는 너무 크거나 작아지기 때문에 대부분의 경우 작동하지 않습니다. 그래서 제 질문은, 이것을 올바르게하는 가장 빠른 방법은 무엇입니까.

+1

부동 소수점 연산이 어떻게 작동하는지 알아보십시오. 그것은 간단합니다. 학교에서 필요한 정보를 대부분 얻었어야합니다. 나머지는 온라인에서 찾을 수 있습니다 (Wikipedia, Google 등 사용). 그리고 부동 소수점 연산 루틴을 구현하십시오. –

+0

하지만 느린 방법입니다. 나는 효율적인 것을 원한다. – MetallicPriest

+0

@AlexeyFrunze OP는 이미 에뮬레이션이 너무 느리다 고 말했습니다. 이것은 부동 소수점을 구현하는 문제가 아닙니다. – sfstewman

답변

13

에뮬레이션이 너무 느립니다. 나는 당신이 부동 소수점의 에뮬레이션을 의미한다고 생각합니다. 스케일 된 정수가 충분하지 않은 경우 유일하게 남아있는 대안은 고정 소수점 연산이지만 에뮬레이트 된 부동 소수점보다 훨씬 빠르지 만 정확하게 빠르지는 않습니다.

또한 스케일 된 정수와 fixed point math을 사용하면 부동 소수점보다 dynamic range이 적다는 사실을 결코 피할 수 없습니다.

그러나 범위를 미리 알고 있다면 고정 소수점 연산 구현을 원하는 범위로 조정할 수 있습니다.

Here is 고정 소수점에 관한 기사. 트릭의 요지는 변수를 분할하는 방법을 결정하는 것입니다. 숫자의 하위 부분과 상위 부분의 비트 수를 결정하는 것입니다.

C에 대한 고정 소수점의 전체 구현은 found here 일 수 있습니다. (BSD 라이센스.) There are others.

+1

즉, 이러한 최적화는 경우에 따라 수행되어야합니다. 은색 탄환은 없습니다. –

+0

@AlexeyFrunze, 참으로. OP 케이스는 꽤 특별한 것 같습니다. –

+0

* 거의 * +1. 주어진 링크는 모두 순수한'C'이고 하나는 자바입니다. 나는 다중 단어 산술을위한 GnuPGP를 좋아한다; * 인라인 * 어셈블러는 사용 가능한 경우 더 빠른 다중 단어 연산을 얻는 데 사용됩니다. 나는 고정 소수점 * 'C'라이브러리가 이것으로부터도 이익을 얻을 수 있다고 생각한다. 고정 소수점은 * dynamic range *가 적지 만 [land minds] (http://www.altdevblogaday.com/2012/02/22/comparing-floating-point-numbers-2012-edition/)가 훨씬 적습니다. , 특히 * embedded * 태그가 주어집니다. –

3

@Amigable 클라크 칸트의 제안에 더하여는 Anthony Williams' fixed point math libraryfloat 또는 double 거의 같은 의미로 사용 할 수있는 C++ fixed 클래스를 제공하며, ARM에 소프트웨어 부동 소수점에 비해 5 배의 성능 향상을 제공합니다. 여기에는 CORDIC 알고리즘을 사용하여 trig 및 log 함수 등을 포함하는 표준 수학 라이브러리의 전체 fixed 포인트 버전이 포함됩니다.

+0

같은 종류의 또 다른 프로젝트는 [google 호스팅 프로젝트] (http://code.google.com/p/fpmath/) 및 [코드 프로젝트 링크] (http://www.codeproject.com/Articles/37636)에 있습니다./Fixed-Point-Class), 이들은 일부 초월 함수를 포함하여 더 많은 라이브러리를 가지고있는 것처럼 보입니다. –

관련 문제