【问题标题】:printf and long doubleprintf 和 long double
【发布时间】:2011-05-04 14:26:35
【问题描述】:

我在 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 ...

【问题讨论】:

标签: c gcc printf long-double


【解决方案1】:

来自 printf 手册页:

l (ell) 后面的整数 转换对应一个long int 或 unsigned long int 参数,或 以下 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)与似乎不会乱成一团的运行时混合在一起。

【讨论】:

  • 您在 Windows 上与 Netbeans 一起使用哪个编译器?
【解决方案2】:

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

【讨论】:

  • 最简单最短的答案是正确的! ^ +点赞
【解决方案3】:

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

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

【讨论】:

【解决方案4】:

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

【解决方案5】:

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

【讨论】:

    【解决方案6】:

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

    【讨论】:

    • 可惜他在 Windows 上,而且他可能没有联机帮助页。无论如何,谷歌搜索“man printf”或“printf 手册页”或类似的东西。
    【解决方案7】:

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

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

    $ 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” $

    【讨论】:

      【解决方案8】:

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

      如果你想使用 long double 那么你必须使用“ __mingw_printf ”和“ __mingw_scanf ”函数来代替 printf 和 scanf。它支持 10 字节长的 double。

      或者你可以像这样定义两个宏:“#define printf __mingw_printf”和“#define scanf __mingw_scanf”

      对 long double 使用标准格式:%Lf

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-30
        • 2013-09-25
        相关资源
        最近更新 更多