一些科学计算的函数

从字符串中读取一个浮点数

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 ;
}