Printf 用于 c 中的浮点数

Posted

技术标签:

【中文标题】Printf 用于 c 中的浮点数【英文标题】:Printf for float in c 【发布时间】:2020-05-16 18:43:46 【问题描述】:

我实际上是在尝试使用 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” here 's the compiler output

对此进行了测试,但没有成功:

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

【问题讨论】:

工具链好像有问题?你用的是哪个编译器? 旁白:如果你有long count;,那么你需要%ld格式说明符。 检查你的 GCC 编译器,因为它给出了正确的输出。 但是 dist 值是一个浮点数返回,因为它有浮点数乘以一个长的计数器。如果我尝试打印 ld 而不是 f,它会给我一个 int 数字 您使用的处理器可能不支持浮点,而是使用软浮点。尝试在 gcc 上使用 -msoft-float 标志编译程序 【参考方案1】:

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

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

/* 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 库,同时使用的代码空间比该库消耗的要少得多。

【讨论】:

检查编辑以查看我测试过的内容,但没有成功 输出:nÇ@ Ÿ@nÇ@ Ÿ@ 我假设你然后以某种方式输出b?如果您想使用printf 而不是sprintf,请去掉out 参数。作为嵌入式程序员,我更倾向于使用sprintf 而不是printf,以便将数据输出到例如LCD 显示器或其他无法真正与printf 配合使用的设备。 是的,我用它在液晶显示器上打印,我只是用 printf 来调试,因为当我把 sprintf 并使用我的函数在液晶显示器上绘制它时,RTT 停止工作. 如果要输出三位有效数字的值,需要乘以2000.0f,而不是2.0f。如果你尝试做类似printf("%4u.%03u", 1234,56); 的事情会发生什么? printf("%4d.%03d", 1234,56); 怎么样?printf 的不同轻量级版本包含不同的功能。如果您尝试使用典型的基于文本的 LCD,一个有用的技巧是从右到左输出整数,通过重复计算 x%10x/10,在输出一些数字后插入小数点。

以上是关于Printf 用于 c 中的浮点数的主要内容,如果未能解决你的问题,请参考以下文章

为啥 % 运算符不能用于 C/C++ 中的浮点数但可以用于 Java 和 C#? [复制]

c++中如何输出保留三位小数的浮点数

C中的浮点数与预期略有不同

如何使用 Irvine32 WriteFloat 而非 printf 显示舍入为 .001 的浮点数

C语言浮点数误差的解决

Lua和C++中的浮点数的比较