본문 바로가기

Developement

고정소수점 연산을 위한 설계.

알림

아래 소스엔 cos() 과 같은 함수에 버그가 많습니다.
그래서 만약 쓰시려면 다른 opensource 를 추천 드립니다.

https://sourceforge.net/p/fixedptc/code/ci/default/tree/



현재 x86 기반 CPU 들은 과거 Pentium 이후로 부터 FPU(부동소수점연산부) 가 CPU 에 포함되어 있기에 문제가 되지 않습니다만, FPU 가 없는 32bit CPU 들중 가장 많이 쓰이는 ARM 의 경우에서는 특정 부동소수점 연산 속도가 매우저하 되는 문제가 있습니다.

부동소수점 보다는 고정소수점이 연산 속도가 매우 빠르며, CPU 에서 emulation 되는 것 때문에 필요로 한 부분이 많습니다.
이를 위해 만든 것이 fixfloatmath 입니다.
소수점을 기준으로 하는 값들은 각각 signed 일 경우 -32768.0 에서 32767.0 까지 표현이 가능하며, 코드를 수정 할 경우 소수점에 해당하는 위치를 bit 로 분배할 경우 좀 더 폭넓게 사용이 가능 합니다.
현재는 16:16 으로 구현된 상태로만 사용하였습니다.

아래에 코드가 있으니 피요하신 분들은 사용하셔도 좋습니다만, 몇가지 조건을 알아야 합니다.

첫째, 코드내에서 정확도를 향상하기 위해 64비트 연산을 하는 부분을 켜기 위해서는 FIXFLOAT_CALC_64 define 을 켜야 합니다. CPU 레지스터에 부하가 안가도록 만드려면 define 을 켜지 않는 것이 좋습니다.

둘째, 고정소수점으로 만든 값에서는 소수점 이하의 값을 바로 가져 오질 못합니다.

셋째, sin 값으로 처리 되는 것은 1도 단위로 총 360 개만 처리 가능합니다.

아래의 코드를 fixfloatmath.h 로 쓰시고,

아래를 fixfloatmath.c 로 정하여 쓰면 됩니다.
ADS 1.2 , RVDS 2.0 , GCC 3.x , minGW 4.4.1 에서 테스트 되었으며 간단한 3D vector 연산에 꽤 큰 도움이 됩니다.
코드 사용은 free 입니다.