手臂-无-EABI-GCC:使用printf打印浮点数

xoshrz7s  于 2023-02-03  发布在  其他
关注(0)|答案(4)|浏览(183)

我正在为SAM 3 N arm cortex-M3微控制器编写一个C程序。当我尝试打印浮点数时,它只打印“f”。示例:printf("%f",43.12);只打印f,不打印43.12
但是打印整数可以很好地工作。
如何启用浮点数的完整打印?我知道编译器默认情况下禁用浮点数打印以减少代码大小(看起来他们链接了精简版)。另外请注意,makefile中没有使用CFLAGS=-Dprintf=iprintf
工具详情:

  • ARM/GNU C编译器:(交叉工具-NG 1.13.1 - Atmel构建版本:13)第4.6.1节
  • 以上工具随Atmel studio 6.0提供。
busg9geu

busg9geu1#

你能试试在链接器设置中添加以下选项吗
-lc -远程监视器-u _打印_浮点
我在ARM-CORTEXM 0中也很成功

r8uurelv

r8uurelv2#

这可能是因为你的平台/库不支持printf/sprintf%f说明符。作为第一种方法,你可以滚动你自己的printf来表示float/double:

void printDouble(double v, int decimalDigits)
{
  int i = 1;
  int intPart, fractPart;
  for (;decimalDigits!=0; i*=10, decimalDigits--);
  intPart = (int)v;
  fractPart = (int)((v-(double)(int)v)*i);
  if(fractPart < 0) fractPart *= -1;
  printf("%i.%i", intPart, fractPart);
}
3qpi33ja

3qpi33ja3#

在默认情况下禁用浮点数的编译器中,默认库可以处理它们是不常见的。浏览你的参考文献,你会发现如何重新编译支持浮点数的适当库的信息,或者(更可能的是)在哪里找到已经用它构建的版本。

yfjy0ee7

yfjy0ee74#

@Agnius Vasiliauskas的答案部分正确,它没有考虑v为负且大于-1(-1〈v〈0)的情况,事实上在这种情况下intPart前面应该有一个负号。
例如:if is v = -0.55 intPart将为0,所以您将打印0.55而不是-0.55!您必须手动添加正确的符号,如下所示。

void printDouble(double v, int decimalDigits)
{
  int i = 1;
  int intPart, fractPart;
  for (;decimalDigits!=0; i*=10, decimalDigits--);
  intPart = (int)v;
  fractPart = (int)((v-(double)(int)v)*i);
  if(fractPart < 0) fractPart *= -1;

  if(v<0 && intPart=0) printf("-%i.%i", intPart, fractPart);
  else printf("%i.%i", intPart, fractPart);
}

相关问题