printf和long double

我在Windows上使用最新的gcc与Netbeans。 为什么不long double工作? printf说明符%lf错的吗?

码:

 #include <stdio.h> int main(void) { float aboat = 32000.0; double abet = 5.32e-5; long double dip = 5.32e-5; printf("%f can be written %e\n", aboat, aboat); printf("%f can be written %e\n", abet, abet); printf("%lf can be written %le\n", dip, dip); return 0; } 

输出:

 32000.000000 can be written 3.200000e+004 0.000053 can be written 5.320000e-005 -1950228512509697500000000000000000000000000000000000000000000000000000000000000 000000000000000000000000000000000000000000000000000000000000000000000000.000000 can be written 2.725000e+002 Press [Enter] to close the terminal ... 

除了错误的修饰符,哪个端口的gcc到Windows? mingw使用微软C库,我似乎记得,这个库不支持80位长双(微软C编译器使用64位长双因各种原因)。

从printf手册页:

l(ell)以下整数转换对应于long int或unsigned long int参数,或者后面的n转换对应于指向long int参数的指针,或者后面的c转换对应于wint_t参数,或者接下来的s转换对应于一个指向wchar_t参数的指针。

LA a,e,E,f,F,g或G转换对应于一​​个长的双重参数。 (C99允许%LF,但SUSv2不允许)。

所以,你想%Le ,而不是%le

编辑:一些进一步的调查似乎表明,Mingw使用MSVC / win32运行时(对于像printf这样的东西) – 将长双倍映射到双倍。 所以混合一个编译器(如gcc),提供了一个本地long double与运行时似乎不是一团糟。

是的 – 对于long double%Lf ,您需要使用%Lf (即大写'L')。

如果您正在使用MinGW,问题是默认情况下,MinGW使用I / O或。 格式化函数从Microsoft C运行时,不支持80位浮点数(在Microsoft土地long double == double )。

但是,MinGW还提供了一系列可以支持长双打的替代实现。 要使用它们,用__mingw_ (例如__mingw_printf )作为函数名称的前缀。 根据项目的性质,您可能还希望在全局#define printf __mingw_printf或使用-D__USE_MINGW_ANSI_STDIO (启用所有printf家族函数的MinGW版本)。

有这个问题testing长双打,唉,我遇到了一个修复! 您必须使用-D__USE_MINGW_ANSI_STDIO编译您的项目:

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test $ gcc main.c

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test $ a.exe c = 0.000000

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test $ gcc main.c -D__USE_MINGW_ANSI_STDIO

Jason Huntley @ centurian /home/developer/dependencies/Python-2.7.3/test $ a.exe c = 42.000000

码:

 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; } 

在C99中, long double的长度修饰符似乎是L而不是lman fprintf (或等效的窗口)应该告诉你为你的特定平台。

正如其他答案中所述,正确的转换说明符是"%Lf"

您可能希望在gcc调用中使用-Wformat (或-Wall ,其中包括-Wformat )来打开格式警告

 $ gcc source.c
 $ gcc -Wall source.c
 source.c:在函数`main`中:
 source.c:5:warning:格式“%lf”期望types为“double”,但参数2的types为“long double”
 source.c:5:warning:格式“%le”期望types为“double”,但参数3的types为“long double”
 $

在Java中正确的Printf对话 : –

  double pi = Math.PI; System.out.format("%f%n", pi); // --> "3.141593" System.out.format("%.3f%n", pi); // --> "3.142" System.out.format("%10.3f%n", pi); // --> " 3.142" System.out.format("%-10.3f%n", pi); // --> "3.142" System.out.format(Locale.FRANCE, "%-10.4f%n%n", pi); // --> "3,1416" Calendar c = Calendar.getInstance(); System.out.format("%tB %te, %tY%n", c, c, c); // --> "May 29, 2006" System.out.format("%tl:%tM %tp%n", c, c, c); // --> "2:34 am" System.out.format("%tD%n", c); // --> "05/29/06"