在C中打印浮点数,同时避免可变参数提升加倍

Xo *_*ang 8 c floating-point printf promotions

如何在C中打印(即stdout)一个浮点数,不是在传递给printf时将其提升为double

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

float f = 0.f;
printf("%f", f);
Run Code Online (Sandbox Code Playgroud)

你会得到

warning: implicit conversion from 'float' to 'double' when passing argument to function
Run Code Online (Sandbox Code Playgroud)

我使用相对较少的处理能力(72MHz ARM Cortex-M3),我肯定是浮点数据的ASCII输出的瓶颈.由于架构缺乏硬件FPU,因此必须在单精度和双精度之间进行转换并不重要.

有没有办法在直线C中更有效地打印浮子?

R..*_*R.. 9

避免升级不会为您节省任何费用,因为内部double(或更可能long double)算术printf将会消耗至少1000倍的时间.准确打印浮点值并不容易.

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

或者你可以做一些像:

printf("%d.%.6d", (int)x, (int)((x-(int)x)*1000000));
Run Code Online (Sandbox Code Playgroud)


Lin*_*cer 5

不幸的是,printf没有支持处理普通浮动:s.

这意味着您必须编写自己的打印功能.如果您不需要完整的表达能力printf,您可以轻松地将浮点值转换为整数部分和表示小数位数的部分,并使用整数打印出来.

另一方面,如果您只想摆脱警告,则可以明确地将其转换float为a double.