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
而不是l
。 man 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"