从 float 到 char 数组的转换
Conversion from float to char array
我需要将我的 float
(传感器)值转换为 char
数组,以便通过 GPRS 发送我的数据。如果我使用任何库函数进行转换,它会占用大量内存,因为控制器的闪存数量较少。我已经尽力在没有库函数的情况下转换数据,但最后还是强制需要math.h文件。没有库函数怎么解决这个问题?
#include <stdio.h>
#include <string.h>
#include <math.h>
unsigned char str[20];
unsigned char *ftos(float f,int precision)
{
memset(str,0,sizeof(str));
float ff;
ff = f;
int a,b,c,k,l=0,m,i=0;
// check for negetive float
if(f<0.0)
{
str[i++]='-';
f*=-1;
}
a=f; // extracting whole number
f-=a; // extracting decimal part
k = precision;
// number of digits in whole number
while(k>0)
{
l = pow(10,k);
m = a/l;
if(m>0)
{
break;
}
k--;
}
// number of digits in whole number are k+1
/*
extracting most significant digit i.e. right most digit , and concatenating to string
obtained as quotient by dividing number by 10^k where k = (number of digit -1)
*/
for(l=k+1;l>0;l--)
{
b = pow(10,l-1);
c = a/b;
str[i++]=c+48;
a%=b;
}
str[i++] = '.';
/* extracting decimal digits till precision */
for(l=0;l<precision;l++)
{
f*=10.0;
b = f;
str[i++]=b+48;
f-=b;
}
str[i]='[=10=]';
return str;
}
int main()
{
float temp = 35.2;
printf("%s",ftos(temp,2));
}
不要尝试打印浮点值,而是打印定点值。例如,这将打印 x
的值,小数点后有 2 位数字:
int main()
{
float x = 35.2;
printf("%d.%02d\n", (int)x, (int)(x * 100) - (int)x * 100);
}
如果您需要将值实际转换为字符数组,请使用 sprintf
而不是 printf
。乘法时要小心避免整数溢出,尤其是当您的平台有 16 位整数时:如果需要,请使用 long
值。
总的来说,在微控制器 C 代码中打印浮点数是个好主意的情况很少。
我需要将我的 float
(传感器)值转换为 char
数组,以便通过 GPRS 发送我的数据。如果我使用任何库函数进行转换,它会占用大量内存,因为控制器的闪存数量较少。我已经尽力在没有库函数的情况下转换数据,但最后还是强制需要math.h文件。没有库函数怎么解决这个问题?
#include <stdio.h>
#include <string.h>
#include <math.h>
unsigned char str[20];
unsigned char *ftos(float f,int precision)
{
memset(str,0,sizeof(str));
float ff;
ff = f;
int a,b,c,k,l=0,m,i=0;
// check for negetive float
if(f<0.0)
{
str[i++]='-';
f*=-1;
}
a=f; // extracting whole number
f-=a; // extracting decimal part
k = precision;
// number of digits in whole number
while(k>0)
{
l = pow(10,k);
m = a/l;
if(m>0)
{
break;
}
k--;
}
// number of digits in whole number are k+1
/*
extracting most significant digit i.e. right most digit , and concatenating to string
obtained as quotient by dividing number by 10^k where k = (number of digit -1)
*/
for(l=k+1;l>0;l--)
{
b = pow(10,l-1);
c = a/b;
str[i++]=c+48;
a%=b;
}
str[i++] = '.';
/* extracting decimal digits till precision */
for(l=0;l<precision;l++)
{
f*=10.0;
b = f;
str[i++]=b+48;
f-=b;
}
str[i]='[=10=]';
return str;
}
int main()
{
float temp = 35.2;
printf("%s",ftos(temp,2));
}
不要尝试打印浮点值,而是打印定点值。例如,这将打印 x
的值,小数点后有 2 位数字:
int main()
{
float x = 35.2;
printf("%d.%02d\n", (int)x, (int)(x * 100) - (int)x * 100);
}
如果您需要将值实际转换为字符数组,请使用 sprintf
而不是 printf
。乘法时要小心避免整数溢出,尤其是当您的平台有 16 位整数时:如果需要,请使用 long
值。
总的来说,在微控制器 C 代码中打印浮点数是个好主意的情况很少。