티스토리 뷰

 

다양한 프로그래밍 언어에서 실수 계산을 위한 float형과 double형을 제공한다.

아두이노에서도 동일하게 float형과 double형을 제공하지만,

아두이노 내에서 처리되는 방식은 두 형식 모두 float형으로 처리된다.

https://www.arduino.cc/reference/ko/language/variables/data-types/double/

 

double - 아두이노 참조

설명 배밀도 부동소수점 숫자. 우노와 ATMEGA 기반 보드에서, 이것은 4바이트를 차지한다. 즉, double 구현은 float 와 정확히 같고, 정확도에서 얻는 게 없다. 아두이노 Due에서 double 은 8바이트 (64비트

www.arduino.cc

 

정밀한 계산을 위해 (일반적으로) 8바이트 크기를 가지는 double형을 사용해야 하지만,

아두이노에서 8바이트 연산을 지원하지 않기 때문에

1) 계산하려는 두 수를 long 타입으로 외부로 보내서 저장할 지 또는

2) 7자리까지 정밀도를 갖는 float형을 그대로 사용할 지에 대해 고민하게 됐다.

 

1)번 방법은 추가적인 프로그래밍(데이터 통신과 외부 연산 후 표시 등)이 필요하고 통신부(송신부와 수신부) 제작 등의 번거로움이 있는 관계로

우선적으로 2)번 방법에 대해 확인하는 단계를 거치고자 한다.

 

테스트 프로그램 소스는 아래와 같다.

double aa1 = 12345678.9012;
long bb1 = 234567890123L;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);

}

void loop() {
  // put your main code here, to run repeatedly:

  Serial.print("[aa1] ");
  Serial.println(aa1, 10);
  float aa2 = aa1*0.4222;
  float aa3 = aa2/(7./6.);
  float bb2 = bb1*1000.;
  float bb3 = bb1/1000.;
  Serial.print("[aa2] ");
  Serial.println(aa2, 10);
  Serial.print("[aa3] ");
  Serial.println(aa3, 10);
  float aa4 = aa3/1000.;
  Serial.print("[aa4] ");
  Serial.println(aa4, 10);
  float aa5 = aa4*1000.;
  Serial.print("[aa5] ");
  Serial.println(aa5, 10);
  float aa6 = aa5/1000.;
  Serial.print("[aa6] ");
  Serial.println(aa6, 10);
  float aa7 = aa6/1000.;
  Serial.print("[aa7] ");
  Serial.println(aa7, 10);
  Serial.print("[bb2] ");
  Serial.println(bb2, 8);
  Serial.print("[bb3] ");
  Serial.println(bb3, 8);
  delay(2000);

}

 

 

float형인 aa1과 long형인 bb1에 대해 테스트를 진행했다.

 

long형의 경우 계산 결과가 2,147,483,647보다 커지면 더 이상 계산이 불가하다는 사실을 알게 됐다. 또한 long형의 추가적인 계산 결과는 전혀 엉뚱한 결과값을 보여 줬다.

따라서 long형을 이용한 아두이노IDE 내 직접적인 계산은 불가하리라 판단됐다.

 

아래는 테스트 결과값을 보여준다.

float형에 대해 다양한 방식으로 곱하거나 나누는 테스트를 진행했다.

중간중간에 결과값의 편차가 약간씩 있긴 하지만 각 단계의 결과값을 보면 앞 7자리의 숫자는 (비교적...이라기보다는) 매우 정확했다.

그리고 최종 결과값도 마찬가지로 앞 7자리의 숫자는 정확하게 표현됐음을 알 수 있다.

 

따라서 백만단위 이하까지(예를 들어 10억단위의) 정확도가 필요하지 않다면, 아두이노IDE 내에서 float로 직접 계산해도 무난한 정확도의 결과를 도출할 수 있을 것으로 판단된다.

 

아두이노를 이용한 계산 결과 계산기를 이용한 정확한 계산 결과(aa1 ... aa7)
[aa1] 12345678.9012000001
[aa2] 5212345.5000000000
[aa3] 4467724.5000000000
[aa4] 4467.7246093750
[aa5] 4467724.5000000000
[aa6] 4467.7246093750
[aa7] 4.4677248001
[bb2] ovf
[bb3] -1655311.12500000
[aa1] 12345678.9012000001
[aa2] 5212345.5000000000
[aa3] 4467724.5000000000
[aa4] 4467.7246093750
[aa5] 4467724.5000000000
[aa6] 4467.7246093750
[aa7] 4.4677248001
[bb2] ovf
[bb3] -1655311.12500000
12345678.9012000000    
0.4222000000    
   5212345.6320866400 
   4467724.8275028300 
   4467724827.5028300000 
   4467724.8275028300 
   4467.7248275028 

 

반응형