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%10
和 x/10
,在输出一些数字后插入小数点。以上是关于Printf 用于 c 中的浮点数的主要内容,如果未能解决你的问题,请参考以下文章
为啥 % 运算符不能用于 C/C++ 中的浮点数但可以用于 Java 和 C#? [复制]