从字符串中读取一个浮点数
uint8_t read_float(char *line, uint8_t *char_counter, float *float_ptr)
{
char *ptr = line + *char_counter;
unsigned char c;
//抓取第一个字符和递增指针。直线上不设空格。
c = *ptr++;
//捕获初始正/负字符
bool isnegative = false;
if (c == '-') {
isnegative = true;
c = *ptr++;
} else if (c == '+') {
c = *ptr++;
}
uint32_t intval = 0; // 存储整数部分
int8_t exp = 0; // 追踪小数点的位置
uint8_t ndigit = 0; // ndigit记录读取数字的个数
bool isdecimal = false;// 标记是否读到小数点
while(1) {
c -= '0';
if (c <= 9) {
ndigit++;
if (ndigit <= 8) {
if (isdecimal) { exp--; }
intval = (((intval << 2) + intval) << 1) + c; // intval*10 + c
} else {
if (!(isdecimal)) { exp++; } //丢弃溢出数字
}
} else if (c == (('.'-'0') & 0xff) && !(isdecimal)) {
isdecimal = true;
} else {
break;
}
c = *ptr++;
}
//如果未读取任何数字,则返回。
if (!ndigit) { return(false); };
//将整数转换为浮点。
float fval;
fval = (float)intval;
//应用十进制。对于预期的E0到E-4范围,应执行不超过两次浮点乘法。
if (fval != 0) {
while (exp <= -2) {
fval *= 0.01;
exp += 2;
}
if (exp < 0) {
fval *= 0.1;
} else if (exp > 0) {
do {
fval *= 10.0;
} while (--exp > 0);
}
}
//用正确的符号指定浮点值。
if (isnegative) {
*float_ptr = -fval;
} else {
*float_ptr = fval;
}
*char_counter = ptr - line - 1; //将char_counter设置为下一个语句
return 0 ;
}