printf和long double

时间:2010-11-03 16:20:33

标签: c gcc 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 ...

8 个答案:

答案 0 :(得分:42)

来自printf联机帮助页:

  

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

  

L A跟随a,A,e,E,f,F,   g或G转换对应于a   长双重论点。 (C99允许   %LF,但SUSv2没有。)

所以,您需要%Le,而不是%le

编辑:一些进一步的调查似乎表明Mingw使用MSVC / win32运行时(对于像printf这样的东西) - 它将long double映射为double。因此,混合使用提供本机long double的编译器(如gcc)和运行时似乎不是一团糟。

答案 1 :(得分:36)

是 - 对于long double,您需要使用%Lf(即大写“L”)。

答案 2 :(得分:22)

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

然而,MinGW还附带了一组替代实现,正确支持长双精度。要使用它们,请在函数名称前加__mingw_(例如__mingw_printf)。根据项目的性质,您可能还需要全局#define printf __mingw_printf或使用-D__USE_MINGW_ANSI_STDIO(这将启用所有printf - 系列函数的MinGW版本)。

答案 3 :(得分:14)

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

答案 4 :(得分:6)

这个问题测试了长时间的双打,唉,我遇到了修复!您必须使用-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;
}

答案 5 :(得分:4)

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

答案 6 :(得分:2)

正如在其他答案中所说,正确的转换说明符是"%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`
$

答案 7 :(得分:0)

C / C ++中的

printf和scanf函数使用Microsoft C库,该库不支持10字节长的double。因此,当您在C / C ++代码中使用printf和scanf函数来打印长双精度字作为输出并将某些输入作为长双精度字打印时,它总是会给您错误的结果。

如果要使用long double,则必须使用“ __mingw_printf”和“ __mingw_scanf”函数,而不是printf和scanf。它支持10字节长的double。

或者您可以定义两个宏,例如:“ #define printf __mingw_printf”和“ #define scanf __mingw_scanf”

对长整型使用标准格式:%Lf