아놔 sin, cos 이 안된다. ㅠ.ㅠ
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);
계산이 간단한 데 비해 수렴 속도는 꽤 빠릅니다.
'Embeded' 카테고리의 다른 글
SPI 통신 (영민이형이 가르쳐준 내용) (0) | 2009.04.16 |
---|---|
기울기 센서 PC와 연동 (2) | 2009.03.26 |
가속도 센서를 이용한 공 굴리기 프로그램. (0) | 2009.03.24 |