C printf与长双精度

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

我在Windows上使用最新的gcc和Netbeans。为什么
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;
}