C 什么';这是冲刺浮动的正确方法吗?

C 什么';这是冲刺浮动的正确方法吗?,c,floating-point,printf,C,Floating Point,Printf,我正在尝试使用以下代码打印F/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

我正在尝试使用以下代码打印F/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'
什么是冲刺浮动的正确方法?有特殊格式的字符吗?我觉得编译器可能会以某种方式强制转换类型,这可能会导致编译速度减慢


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

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

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

您的gcc变体已损坏。在C语言中,无法将
float
传递给变量函数。小类型(
char
short
float
)的默认升级至少要达到
int
/
double
)。我猜是谁入侵了这个微控制器的gcc,他做了一些事情来禁止促销,可能是因为
double
很慢或者很难通过。你应该把他们烧到地狱再烧回来。如果编译器供应商不想正确支持
double
,正确的解决方案是使所有浮点类型的大小相同并等效于
float
,而不是违反语言的升级规则


另一个想法是:
sprintf
的原型也可能丢失或错误,例如
intsprintf()而不是
intsprintf(char*,constchar*,…)
%f
是浮点
%lf
双精度和
%lf
长双精度。您正在使用什么编译器?如果您担心导致速度缓慢的原因,请对其进行分析。@Let_Me_成为dsPIC33F的GCC(v3.23)。(也称为微芯片MPLAB C30。)@Nathan像我这样的小型微控制器几乎没有基本的调试功能,忘了配置文件吧@让我来吧:根据我在glibc6上的sprintf手册页,
f
f
都是双精度的。我总是在用于Linux的GCC上传递浮点值,在32位和64位系统上都没有问题,尽管我总是使用GCC>=4,而不是GCC 3.23。@Thomas:当你“将一个
float
”传递给一个变量函数时,它会自动升级为
double
,并作为double传递。这种行为是C语言所必需的。它最终是哪个问题?谢谢你接受我的回答,但我很好奇。:-)