C printf与长双精度
我在Windows上使用最新的gcc和Netbeans。为什么C printf与长双精度,c,gcc,printf,long-double,C,Gcc,Printf,Long Double,我在Windows上使用最新的gcc和Netbeans。为什么long double不起作用?printf说明符%lf是否错误 代码: 在C99中,long double的长度修饰符似乎是L,而不是Lman fprintf(或适用于windows的等效文件)应该告诉您特定的平台。在C99中,长双精度的长度修饰符似乎是L,而不是Lman fprintf(或windows的等效版本)应该告诉您特定的平台。是——对于long double,您需要使用%Lf(即大写字母“L”)。是——对于long do
long double
不起作用?printf
说明符%lf
是否错误
代码:
在C99中,
long double
的长度修饰符似乎是L
,而不是L
man fprintf
(或适用于windows的等效文件)应该告诉您特定的平台。在C99中,长双精度
的长度修饰符似乎是L
,而不是L
man fprintf
(或windows的等效版本)应该告诉您特定的平台。是——对于long double
,您需要使用%Lf
(即大写字母“L”)。是——对于long double
,您需要使用%Lf
(即大写字母“L”)。从printf手册页:
l(ell)一个以下整数
转换对应于长整数
或无符号长整型参数,或
以下n转换对应于
指向长整型参数的指针,或
以下c
转换对应于wint_t参数或以下的
转换对应于指向的指针
反对论据
及
A后面跟着A,A,e,e,f,f,
g、 或g转换对应于a
冗长的双重论证。(C99允许
%LF,但SUSv2没有。)
所以,您想要的是%Le
,而不是%Le
编辑:一些进一步的调查似乎表明,Mingw使用MSVC/win32运行时(用于printf之类的东西)——它将长的double映射到double。因此,将提供本机long double的编译器(如gcc)与似乎不支持的运行时混合使用。。一团糟。从printf手册页: l(ell)一个以下整数 转换对应于长整数 或无符号长整型参数,或 以下n转换对应于 指向长整型参数的指针,或 以下c 转换对应于wint_t参数或以下的 转换对应于指向的指针 反对论据 及 A后面跟着A,A,e,e,f,f, g、 或g转换对应于a 冗长的双重论证。(C99允许 %LF,但SUSv2没有。) 所以,您想要的是
%Le
,而不是%Le
编辑:一些进一步的调查似乎表明,Mingw使用MSVC/win32运行时(用于printf之类的东西)——它将长的double映射到double。因此,将提供本机long double的编译器(如gcc)与似乎不支持的运行时混合使用。。乱七八糟。正如在其他答案中所说,正确的转换说明符是
“%Lf”
您可能希望在gcc调用中使用-Wformat
(或-Wall
,其中包括-Wformat
)来打开格式警告
$ gcc source.c
$ gcc -Wall source.c
source.c: In function `main`:
source.c:5: warning: format "%lf" expects type `double`, but argument 2 has type `long double`
source.c:5: warning: format "%le" expects type `double`, but argument 3 has type `long double`
$
$gcc source.c
$gcc-Wall source.c
source.c:在函数“main”中:
source.c:5:警告:格式“%lf”应为'double'类型,但参数2的类型为'long double'`
source.c:5:警告:格式“%le”应为'double'类型,但参数3的类型为'long double'`
$
正如在其他答案中所述,正确的转换说明符是
“%Lf”
您可能希望在gcc调用中使用-Wformat
(或-Wall
,其中包括-Wformat
)来打开格式警告
$ gcc source.c
$ gcc -Wall source.c
source.c: In function `main`:
source.c:5: warning: format "%lf" expects type `double`, but argument 2 has type `long double`
source.c:5: warning: format "%le" expects type `double`, but argument 3 has type `long double`
$
$gcc source.c
$gcc-Wall source.c
source.c:在函数“main”中:
source.c:5:警告:格式“%lf”应为'double'类型,但参数2的类型为'long double'`
source.c:5:警告:格式“%le”应为'double'类型,但参数3的类型为'long double'`
$
除了错误的修饰符外,gcc的哪个端口连接到Windows?mingw使用Microsoft C库,我似乎记得该库不支持80位长的double(Microsoft C编译器出于各种原因使用64位长的double)。除了错误的修饰符,gcc到Windows的哪个端口?mingw使用Microsoft C库,我似乎记得该库不支持80位长的double(Microsoft C编译器出于各种原因使用64位长的double)。如果使用mingw,问题是默认情况下,mingw使用I/O响应。来自Microsoft C运行时的格式化函数,该运行时不支持80位浮点数(
long double
==double
)
然而,MinGW还提供了一组可供选择的实现,它们确实支持长双工。要使用它们,请在函数名前面加上
\uuuu mingw\uuu
(例如\uuuu mingw\u printf
)。根据项目的性质,您可能还希望全局定义printf\uuu mingw\u printf或使用-D\u use\u mingw\u ANSI\u STDIO
(这将启用所有printf
-族函数的mingw版本) 如果使用MinGW,问题是默认情况下,MinGW使用I/O resp。来自Microsoft C运行时的格式化函数,该运行时不支持80位浮点数(long double
==double
)
然而,MinGW还提供了一组可供选择的实现,它们确实支持长双工。要使用它们,请在函数名前面加上
\uuuu mingw\uuu
(例如\uuuu mingw\u printf
)。根据项目的性质,您可能还希望全局定义printf\uuu mingw\u printf或使用-D\u use\u mingw\u ANSI\u STDIO
(这将启用所有printf
-族函数的mingw版本) 在测试长双打时遇到了这个问题,唉,我遇到了一个解决方案!您必须使用-D_uuse_MINGW_ANSI_STDIO编译您的项目:
杰森Huntley@centurian/home/developer/dependencies/Python-2.7.3/test
$gcc main.c
杰森Huntley@centurian/home/developer/dependencies/Python-2.7.3/test
$a.exe c=0.000000
杰森Huntley@centurian/home/developer/dependencies/Python-2.7.3/te
$ gcc source.c
$ gcc -Wall source.c
source.c: In function `main`:
source.c:5: warning: format "%lf" expects type `double`, but argument 2 has type `long double`
source.c:5: warning: format "%le" expects type `double`, but argument 3 has type `long double`
$
Jason Huntley@centurian /home/developer/dependencies/Python-2.7.3/test
$ cat main.c
#include <stdio.h>
int main(int argc, char **argv)
{
long double c=42;
c/3;
printf("c=%Lf\n",c);
return 0;
}