티스토리 뷰

Arduino

[Arduino] Floating-Point number 구분

생각많은 소심남 2012. 3. 5. 11:22
이제 학기도 개학했으니 전공에 맞는 공부를 해야 될 것 같습니다. 우선 베이스로 할 책은 이겁니다.

 
물론 아두이노와 관련된 국내의 책들이 있기는 하지만 정말 사보면 내용이 적습니다. 그래서 정말로 알고 싶은 사람은 해외 원서를 사서 봐야 합니다. 그리고 적절하다고 생각하는 책이 바로 이 Arduino Cookbook이었습니다. 물론 책가격이 좀 나가기는 하지만 교보문고를 통하면 그나마 편하게 구입할 수 있습니다.

그래서 이번 포스팅에서 처음 다뤄볼 내용은 제일 간단한 float형 변수의 인지입니다.
c언어 공부를 하신 분이라면 이 변수형에 대해서 많이 들어보셨을겁니다. 사실 범위가 몇부터 몇까지다 라는게 정해져있지만 우리가 쓰는데 그 숫자 범위를 알아야 할 필요가 있을까요? 그래서 그냥 바로 테스트해보고자 합니다.

우선 간단하게 알아둬야할 명령어가 있습니다.

Serial.println(...) 

참고로 print엘n 입니다. print아이n이 아니고...
아두이노상에서 가장 간단한 명령어입니다. 바로 시리얼포트를 이용해서 모니터에 결과값을 출력하는 기능을 수행합니다. 다만 이 기능을 수행하려면 setup과정에서 시리얼포트를 활성화줘야 합니다. 그리고 이때는 무조건 전송이 되는게 아니라 컴퓨터통신의 구조상 정해진 baud rate을 설정해줘야 합니다. 믈론 이 부분에 대한 내용을 언젠가는 다뤄보겠습니다. 

우선 이번 시간에 할 내용은 1.1이란 값을 float형 변수로 지정해서 0.1씩 줄인후 그에 대한 절대값이 0에 가까워지는 건지를 알아보는 것입니다. 우선은 변수부터 지정하고 앞에서 말한 setup 과정에서 baud rate를 지정해주는 과정이 필요합니다.


위와 같이 지정해주면 value란 float형 변수에 1.1이란 값이 저장되고 9600bps의 속도로 컴퓨터와 아두이노사이의 통신을 하겠다는 것을 나타냅니다. 우리가 진짜로 할 내용은 loop()에서 해주면 되겠지요.


참고로 fabs() 함수는 math.h 헤더파일에 들어있는 함수로써 float 변수의 절대값을 구하는 겁니다.
이론상으로 이렇게 하면 어느 순간에는 value가 0이 나오는 순간이 있을겁니다. 그때는 당연히 메세지가 
The value is exactly zero 라는 메세지가 출력되어야 합니다.그럼 이 파일을 토대로 실행을 해봅니다.

verify를 거친후 uplaod를 하면 아무동작이 안 일어날겁니다. 사실 우리는 컴퓨터와 아두이노사이의 통신을 시리얼 포트로 하기 때문에 이를 관찰하기 위해서는 Serial Monitor를 통해야 합니다. Tools에 이 항목이 있습니다.
(단축키: Ctrl+shift+M)


 자 열어보면 다음과 같이 뜹니다.
 



예상했던 결과와 다릅니다. 정확히 0이 아니라 0에 가깝다는 내용이 출력됩니다. 어찌된 일일까요?

이는 float형 변수라면 어쩔 수 없는 겂니다. float형 변수는 변수의 표현을 이진법으로 하고, 그안에서 부호,지수, 가수가 모두 표현되어 있는 수입니다. 특히 그 값의 변화는 보통 자연함수 e에 의해서 결정됩니다. 여러분도 알다시피 지수함수에서 0이라는 값은 표현할수 없습니다. 물론 지수와 가수를 적절하게 조절해서 0에 가깝게는 조절이 가능하지만 정확히는 표현할 수없는거지요. 이때 approximation이 발생합니다. 이게 error로 나타나는 것입니다.

실상 이렇게 보다보면 또다른 변수인 double에 대해서도 따져볼 필요가 있습니다. 그런데 엄연히 double도 float의 범위와 거의 동일합니다. 아두이노 홈페이지에서도 double형은 float의 또다른 이름일 뿐이다 라고 정의되어 있습니다.대신 double형을 쓰면 조금더 높은 정확성을 가진다고 정의합니다. 그래서 이 두 변수를 사용할때는 정확성의 측면에서 고려해봐야하는 것이 중론입니다. 물론 실제의 계측값을 표현할때는 float형 변수가 낫겠지만 아니라면 double형 변수가 나을지도요.

댓글