首页 > 解决方案 > Printf 用于 c 中的浮点数

问题描述

我实际上是在尝试使用 atmel std 在 c 中打印一个浮点数,而不是打印 value ,它只给了我“f”。有谁知道为什么会这样?

代码 :

  float dist = 2.0*3.14*0.25*count;

  printf("counter : %d\n",count);
  printf("dist : %f\n", dist);

所以,计数器实际上是一个 volatile long,在我的硬件上单击按钮后更新,认为它正在工作,它的打印是正确的,但是 dist 的打印不正确,它给了我这个:

dist : f
counter : 12
dist : f
counter : 12
dist : f
counter : 12
dist : f
counter : 12
dist : f
counter : 12
dist : f

即使我尝试像这样打印 0.25:

printf("%f\n",0.25);

它给了我输出“f” 这是编译器输出

对此进行了测试,但没有奏效:

    char b[10];

    uint32_t dist = b_radious*counter*M_PI*2.0f;

    dist = (dist + 1) >> 1;

    unsigned units = dist/1000;
    unsigned fraction = dist - (dist*1000);

    sprintf(b, "%4u.%03u", units, fraction);

标签: catmel

解决方案


为了printf支持浮点输出,它需要包含相当大量(数千字节)的代码,这对于许多使用 printf 但不使用它来输出浮点数的应用程序来说完全没用。printf如果代码输出浮点数,一些工具链会尝试自动链接一个全功能版本,如果不输出浮点数,则自动链接一个最小版本,但一些工具链要求用户手动选择printf要使用的版本。

请注意,如果代码空间有任何问题,请使用以下结构:

/* Output a number from 0.000 to 9999.000 */
uint32_t xi = x*2000.0f;
xi = (xi+1) >> 1; // Round value without extra floating-point math
unsigned units = xi/1000;
unsigned frac = xi - (units*1000);
sprintf(out, "%4u.%03u", units, frac);

避免使用浮点格式printf可以避免使用更大的printf库,同时使用的代码空间比该库消耗的要少得多。


推荐阅读