我如何在 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/