티스토리 뷰
다양한 프로그래밍 언어에서 실수 계산을 위한 float형과 double형을 제공한다.
아두이노에서도 동일하게 float형과 double형을 제공하지만,
아두이노 내에서 처리되는 방식은 두 형식 모두 float형으로 처리된다.
https://www.arduino.cc/reference/ko/language/variables/data-types/double/
정밀한 계산을 위해 (일반적으로) 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 |
'SWDesk > Firmware' 카테고리의 다른 글
[FW] ATTiny85 PWM 예제 (0) | 2024.04.02 |
---|---|
[FW] ESP32 PWM 예제 (1) | 2024.03.31 |
아두이노 나노 ESP32 - BLE 예제 with Advertising (0) | 2024.01.05 |
아두이노 나노 ESP32 - BLE 예제 (0) | 2024.01.03 |
아두이노 나노 ESP32 - POST Request 예제 (0) | 2023.12.28 |
- Total
- Today
- Yesterday
- ServantClock
- 심심풀이치매방지기
- 오블완
- Hurdles
- Video
- BSC
- DYOV
- Decorator
- Innovation&Hurdles
- 빌리언트
- 혁신과허들
- arduino
- 심심풀이
- 아두이노
- 배프
- Innovations
- badp
- 치매방지
- 티스토리챌린지
- 전압
- 절연형
- Innovations&Hurdles
- 혁신
- 전류
- 둎
- bilient
- 허들
- 전압전류모니터링
- image
- 치매
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |