728x90
반응형
정수데이터를 ascii로 변환해 serial로 전송하는 것은 어렵지 않다. float나 double형처럼 소수점을 포함한 데이터를 serial로 전송하는게 생각보다 만만치 않다. 구글링 하던 중 얻은 코드를 기록.
이전에 올린 float to ascii 코드는
0.00111 인 경우 0.111로 반환해 주지만, 아래 코드는 0.00111로 반환해 정확한 데이터를 확인할 수 있다.
char * dtoa(char *s, double n) {
// handle special cases
if (isnan(n)) {
strcpy(s, "nan");
} else if (isinf(n)) {
strcpy(s, "inf");
} else if (n == 0.0) {
strcpy(s, "0");
} else {
int digit, m, m1;
char *c = s;
int neg = (n < 0);
if (neg)
n = -n;
// calculate magnitude
m = log10(n);
int useExp = (m >= 14 || (neg && m >= 9) || m <= -9);
if (neg)
*(c++) = '-';
// set up for scientific notation
if (useExp) {
if (m < 0)
m -= 1.0;
n = n / pow(10.0, m);
m1 = m;
m = 0;
}
if (m < 1.0) {
m = 0;
}
// convert the number
while (n > PRECISION || m >= 0) {
double weight = pow(10.0, m);
if (weight > 0 && !isinf(weight)) {
digit = floor(n / weight);
n -= (digit * weight);
*(c++) = '0' + digit;
}
if (m == 0 && n > 0)
*(c++) = '.';
m--;
}
if (useExp) {
// convert the exponent
int i, j;
*(c++) = 'e';
if (m1 > 0) {
*(c++) = '+';
} else {
*(c++) = '-';
m1 = -m1;
}
m = 0;
while (m1 > 0) {
*(c++) = '0' + m1 % 10;
m1 /= 10;
m++;
}
c -= m;
for (i = 0, j = m-1; i<j; i++, j--) {
// swap without temporary
c[i] ^= c[j];
c[j] ^= c[i];
c[i] ^= c[j];
}
c += m;
}
*(c) = '\0';
}
return s;
}
728x90
반응형
'Programming language > C' 카테고리의 다른 글
[C] C언어 #연산자, ##연산자, c ## macro, 토큰 붙여넣기 연산자 (0) | 2023.02.27 |
---|---|
[C] memset 사용법, memset 을 이용한 변수 초기화 (0) | 2023.02.25 |
[C] C 에서 typeof, typeof 란? C언어 typeof (0) | 2022.11.23 |
[C] float to ascii(실수형을 아스키 코드로) (1) | 2022.09.21 |
[C] 포인터, C 포인터, C Pointer, 포인터 활용하기 - 1 (0) | 2022.09.03 |