c - 在 C 中打印 float ,同时避免将可变参数提升为 double

标签 c floating-point printf promotions

我如何在 C 中打印(即输出到标准输出)float 而不在传递给 double 时将其提升为 double打印?

这里的问题是 C 中的可变参数函数将所有 float 参数提升为 double,这会导致两次不必要的转换。例如,如果您在 GCC 中打开 -Wdouble-promotion 并编译

float f = 0.f;
printf("%f", f);

你会得到

warning: implicit conversion from 'float' to 'double' when passing argument to function

我可以使用的处理能力相对较小(72MHz ARM Cortex-M3),而且我在 float 据的 ASCII 输出上肯定是瓶颈。由于该架构一开始就缺少硬件 FPU,因此必须在单精度和 double 之间进行转换无济于事。

有没有办法在直接 C 中更有效地打印 float ?

最佳答案

避免提升不会为您节省任何东西,因为内部 double(或更可能是 long double)算法 printf 将执行消耗至少 1000 倍的时间。准确打印浮点值并不容易

如果您不关心准确性,而只需要快速打印近似值,则可以滚动自己的循环来进行打印。只要您的值不太适合整数类型,首先将非小数部分转换并打印为整数,然后减去它并循环乘以 10 并取下整数部分以打印小数部分一次一个数字(将其缓冲在一个字符串中以获得更好的性能)。

或者你可以做类似的事情:

printf("%d.%.6d", (int)x, (int)((x-(int)x)*1000000));

关于c - 在 C 中打印 float ,同时避免将可变参数提升为 double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5522051/

相关文章:

c - valgrind 在这段代码上出现无效写入错误

c - 有没有合适的方法来编写连续运行的程序

c++ - 无法从 C++ 中的多维数组中检索正确的浮点值

floating-point - 如何确定两个任意 a 和 b 之间唯一 float 的数量?

c - printf() 函数如何处理使用全局缓冲区的函数返回的字符串?

c - 使用 opencv 构建自定义 ffmpeg4.1 时出错

math - float 学有问题吗?

将带十六进制的无符号整数转换为字符串

c++ - 是否可以将cin与cout并行使用?

c - 如何停止循环并等待从串行接收到不同的值