반응형

Cortex-M3 를 장착한 보드에서 뭘좀 만들다가 가속도 센서를 이용해서 어플을 만드는데 sin, cos 에 인자로 가속도 센서에서 넘어온 값만 넣으면 에러가 나는 것이었다. 분명히 그 값을 찍어봐도 아무 이상이 없었는데....

static short
형 배열이었는데. 왜 안되는것일까.?
인터넷을 뒤져보니 다음과 같은 경우가 있었다.


출처 : http://kldp.org/node/42787

math
계열 함수만 넣으면 컴파일이 안돼서 삽질을 했더니만..
보드 업체쪽에서 아직 math 계열을 사용할 수 없다고 하네요.. -_-a

어디 공개된 math 계열 함수들이 없을까요?
sin(), cos().. sqrt()
정도만 사용하면 되는데요..

여기저기 뒤져보고 있는데 마땅한 것이 없네요.

simple하고 멋진 놈 있으면 소개 부탁 드립니다..


 

초월함수는 테일러 급수를 이용하여 다항함수로 근사시킬 수 있습니다.

직접 구현하셔도 그리 어렵지 않습니다.
다음은 제가 레포트로 짰던 sin 함수 구현입니다. 참고하세요~


<?
    function factorial($number){
        $result=1;
        for ($i=1; $i<=$number; $i++){
            $result = $result * $i;
        }
        return $result;
    }
    function my_sin($x){
        $result = $x  - pow($x,3)/factorial(3)
                + pow($x,5)/factorial(5) - pow($x,7)/factorial (7)
                + pow($x,9)/factorial(9) - pow($x,11)/factorial(11)
                + pow($x,13)/factorial(13) - pow($x,15)/factorial(15)
                + pow($x,17)/factorial(17) - pow($x,19)/factorial(19);
        return $result;
    }

    $temp = my_sin(M_PI);
    $foo = sin(M_PI);

    echo "my_sin $temp sin $foo";
?>

 


 

임베디드 환경이신것 같습니다만...
saxboy
님 말씀처럼 테이블을 이용하는 방법도 괜찮을 것입니다. 별로 오차를 따지지 않는 다면 말입니다.

소수점 이하 몇 번째 숫자가 오차를 발생시킬 수 있는 환경이 아니라면 추천드립니다. 대부분의 환경에서는 괜찮겠죠 ^^;

테이블을 사용하시면 int 만 갖고도 굉장히 빨리 연산하실 수 있을 겁니다.
테이블 크기도 줄일 수 있습니다. sin(), cos()는 주기가 있지 않습니까? 간단한 연산으로 테이블을 1/4로 만들 수도 있습니다.

 


 

sin cos는 둘 중의 하나만 구현하면 나머지는 관계식으로 구할 수 있겠죠.
테일러 급수든 테이블 방식이든 적당한 것을 택해서 임의의 각도를 0~pi/2 범위로
환산해서 계산하면 되겠네요.
그런데 sqrt는 테일러 급수로는 무리가 있겠군요. 1 부근에서 전개해야 하는데
1
보다 훨씬 큰 수에 대해서 계산하려면 몇 항까지 해야 할지 정하기가 어렵죠.
factorial
을 계산해야 하는 부담도 있고요. 이것은 Newton-Rhapson 법을
쓰면 어떨까 합니다. sqrt(a)를 계산한다면


for initial value x0 and tolerance
do {
    delta_x = (a/x0 - x0) / 2;
    x0 += delta_x;
} while (fabs(delta_x) > tolerance);

계산이 간단한 데 비해 수렴 속도는 꽤 빠릅니다.

 

 

반응형
Posted by Real_G