什么是sprintf浮动的正确方法?

时间:2010-12-02 16:50:35

标签: c floating-point printf

我正在尝试使用此代码printf / sprintf浮点数:

sprintf(buff, "FPS: %d\n%.4f N %.4f E\nAl: %.1fm Rl: %.1f\n", fps, p_viewer.p.lat, p_viewer.p.lon, p_viewer.p.alt, p_viewer.roll);

但是当我这样做时,我会收到这些警告:

gfx_game_engine.c:300: warning: format '%.4f' expects type 'double', but argument 4 has type 'float'
gfx_game_engine.c:300: warning: format '%.4f' expects type 'double', but argument 5 has type 'float'
gfx_game_engine.c:300: warning: format '%.1f' expects type 'double', but argument 6 has type 'float'
gfx_game_engine.c:300: warning: format '%.1f' expects type 'double', but argument 7 has type 'float'

sprintf一个浮点数的正确方法是什么?是否有特殊的格式字符?我觉得编译器可能会以某种方式转换类型,这可能会导致它减慢速度。

我正在使用dsPIC33FJ128GP802微控制器并使用MPLAB C30进行编译,MPLAB C30是GCC v3.23的变体。

3 个答案:

答案 0 :(得分:8)

您的gcc变体已被破坏。在C语言中,无法将float传递给可变参数函数。小型(charshortfloat)的默认促销活动始终适用至少int / double。我猜这个微控制器攻击gcc的人做了一些禁用促销的事情,可能是double缓慢或难以通过的想法。你应该把它们焚烧到地狱和背部。如果编译器供应商不想正确支持double,那么正确的解决方案是使所有浮点类型具有相同的大小并等同于float,而不是违反该语言的升级规则。

另一个想法:sprintf的原型也可能缺失或错误,例如int sprintf();而不是int sprintf(char *, const char *, ...);

答案 1 :(得分:3)

float个参数应自动​​转换为double。似乎没有其他方法可以打印float。在这种情况下,您的编译器不应该抱怨。

答案 2 :(得分:2)

scanf不同,其中%f表示浮点数,%lf表示加倍,printf不区分它们。因此,如果通过库链接实现printf(或其变体),则编译器必须进行转换。