C 什么';这是冲刺浮动的正确方法吗?
我正在尝试使用以下代码打印F/sprintf浮动: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
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语言所必需的。它最终是哪个问题?谢谢你接受我的回答,但我很好奇。:-)