繁体   English   中英

arm-none-eabi-gcc:使用 printf 打印浮点数

[英]arm-none-eabi-gcc : Printing float number using printf

我正在为 SAM3N arm cortex-M3 微控制器编写一个 C 程序。 当我尝试打印浮点数时,它只打印“f”。 示例: printf("%f",43.12); 仅打印f ,不打印43.12

但是用整数打印效果很好。

如何启用花车的完整打印? 我知道编译器默认情况下会禁用浮点打印以减小代码大小(即,它们似乎链接了精简版)。 另外请注意,makefile 中没有使用CFLAGS=-Dprintf=iprintf iprintf。

工具详情:

  • ARM/GNU C 编译器:(crosstool-NG 1.13.1 - Atmel 版本:13)4.6.1
  • 以上工具随 Atmel studio 6.0 一起提供。

您可以尝试在链接器设置中添加以下选项

-lc -lrdimon -u _printf_float

它在ARM-CORTEXM0中对我有用

可能是因为您的平台/库不支持printf/sprintf %f格式说明符。 作为第一种方法,您可以为浮动/双打滚动自己的printf:

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

@Agnius Vasiliauskas 的答案是部分正确的,它不考虑 v 为负且大于 -1 (-1<v<0) 的情况,实际上在这种情况下 intPart 应该前面有一个负号。

例如:如果 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);
}

在默认情况下禁用浮点数的编译器中,默认库可以处理它们是不常见的。 查看引用,您将找到有关如何使用浮点支持重新编译相应库的信息,或者(更有可能)在何处查找已使用它构建的版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM